Refactored replays to use a decorator pattern.

Previously, replays relied on subclasses to record or
playback a game.  Now, a game can be recorded by
calling record(game) before the game starts, and a
replay can be played back by calling playback(replay)
after the replay is loaded.

 This allows for far greater flexibility in terms of how
 replays are recorded and played back (for example, it
 can now be used with the console app, or with future
 netplay games)