Change the structure of the program startup.

GameContext now must be inherited from and registered from outside of the Engine.
GameContext now has 4 pure virtual methods that must be implemented by deriving contexts.
Lots of other changes to code quality.