Cleans up the Player type.

Adds a PlayerType ADT to distinguish between Human and AI players,
which simplifies some of the code related to the Player type.
Moves some of the code into different files.

This is mostly in preparation for separating the game logic out
from Main.hs
Adds StateT into the mix.

There is still a lot of cleanup that could be done with respect
to the StateT code, but I'd probably do that after adding RandomT
and WriterT into the mix (although WriterT has problems, it's nice
for learning).

This is at least a start.
Fix some hlint warnings
Fixes some problems from a dodgy conflict resolution.
Changes to use a MonadState constraint.

This allows a bit more flexibility while experimenting with
different ways of tying together the monad transformer stack.

It also means that we can limit the effects that our helper
functions have access to - if they don't need to access the state,
we don't provide the MonadState constraint, and then we have something
that we can reuse in other monad transformer stacks later on.
Removes Writer for the time being
Purifies some functions
Simplifies some code
Adds cabal sandbox files to .gitignore
Merge remote-tracking branch 'dalaing/master'

Conflicts:
	src/Main.hs

* small logic fix: `max` instead of `min`
* incorporated the reverse fix