Refactor Main into separate startup classes for each OS

As part of a general cleanup, I'm moving the startup of each application to its own class -- ie Windows now uses HearthStatsWin instead of Main, Mac OS X now uses HearthStatsOsx instead of Main. This makes the code cleaner by eliminating the use of reflection to load ProgramHelper* classes, and is the first step in fixing up the Config class because it moves a couple of methods out.

@tyrcho Have a look at the implementation of `Environment` and tell me what you think... I could have put static methods on the `Environment` object to make it easy to access it, but I decided that it's probably better to pass an instance of the `Environment` class into `Monitor` to make the code more flexible and easier to unit test. I think that's the right approach, but you should have a look. Go ahead and accept this pull request if you agree.
also : override is only used to show that you change a behaviour defined in a parent type. Here we are simply implementing an abstract method so it's more confusing