Refactored code into Object-Oriented style

Previously, the code was a missmash of OO and scripting, with everything
pulled into the global scope. This is a Bad Thing. Objects should be
able to exist independently from one another, and their interactions
should be defined with references (when necessary).

Going forward, we'll need to change the codebase a little more to
reflect this separation. For example, in many of the various object's
init methods, the object places itself on the board. The board should
be the one to call the appropriate methods to place objects.