Plays a move and returns the updated Position.
Throws a PlayError if the move is not legal.
Position<T> play(Move move) { if (isLegal(move)) { return playUnchecked(move); } else { throw PlayError('Invalid move $move'); } }