As of right now, ~78% of make_move_mut is in update_attackers. Incrementally updating instead of fully re-computing would be ideal.
https://www.chessprogramming.org/Incremental_Updates#Attack_table
Flamegraph of make_move_mut (from perft(6))

Lazily evaluating update_attackers doesn't help much, if we're searching legal moves we'll need it every time anyway.