Create game object.
Add opponent player concept to game state.
Add board validation checks.

Also clean up guard file to for better scopes.
Partialy refactor game state api.

Clean up method names for win checking.
Refactor available_moves method

Adjust logic to support arbitrary board size
Refactor apply_move method of game_state
Refactor win check to handle arbitrary board size
Refactor data packing to web layer.

Move all of the logic that packs and unpacks the data, or rather
translates from the json format to the business objects into the web
layer. This should be the only place where the board size and pieces are
known or configured.

Also clean up calls to board.length or row.length
Remove other unused game_spec.
Clean up and refactor the perfect player.

Leverage refactorings of the game state and extract sub routines to
improve readability.
Rafactor the perfect player and make tests pass.

Clean up the web app class for readability, ensure all existing tests
pass and fix any code quality errors.
Add test for game_state exception handling.