ComputerPlayer class with constructor
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
Call Board.__hash__() explicitly in outcome()

Since boards are mutable, they don't work as indices for a dictionary.  Thus,
the "outcomes" dictionary is replaced with an array indexed by boards' hash
values.
Use players' symbols instead of 'x' and 'o' in Board.__hash__()