Use a protocol and records for moves instead of tuples

Accomplishes two things:

- Makes the make-move code a whole lot cleaner since we
  have now used polymorphism to group moves by what sort
  of move they are
- Makes it easier to start working on playing backwards
Castling bugfix