Refactored "BotConfig" class and added "AppContext" class.

BotConfig now reads its data from a "Properties" object.  Also, it's no
longer a singleton, though it is still treated as such.  This makes it
easier to unit test.

I also added the "AppContext" class for storing objects that are used
throughout the application.  BotConfig is stored in this object, since
it is accessed in many different places thoughout the codebase.

And I added a "ROOMS" property to BotConfig, so you can define which
room(s) you want the bot to join.
I personally think the invalid configuration should just log a WARNING instead of terminating the program, at least in case of the rooms. This would make the startup more robust