Remove MoveInfo::san().
Start with Position.make_unvalidated_move().
Add LegalMoveGenerator.
Add Position.get_legal_moves().
Move generation does not change the position.