Add copy() function to Board
Add outcome() function to ComputerPlayer class

This dynamic programming routine will serve as a helper for takeTurn().
It recursively checks whether the player can force a win or a draw on a
given board, storing results as they are computed to avoid duplicating work.

A player wins if he can move to a board on which he wins and draws if he cannot
win but can move to a board on which he draws.  Otherwise he loses.  The base cases
are the end game scenarios.
Add write() function to Board

Write a given symbol to a given position
Use write() function to change entries of board
Implement ComputerPlayer.takeTurn()
Replace 1st human player with computer player
Board constructor takes optional 9-char string as argument

Characters 0-2 represent row 0, 3-5 row 1, 6-8 row 2
Debug ComputerPlayer.takeTurn()

Main issue was that the recursive outcome() helper function needs to take
an extra parameter specifying which player's turn it is; otherwise, the function
will behave as if the computer player gets to keep taking turns until it wins.

Other changes include:
- Add otherSymbol() helper function; returns a symbol on the board other
than the one specified
- Set winner = None in case of tie

TODO: there appears to be a problem with the hash function