The main entry point for the game engine: Take a game state and a move, and
return another game state. The game state contains an error field in case
something went wrong, but otherwise it is assumed that the returned game
instance is the state of the game after the move was applied.