Allow different sources of configuration

All of the previous configuration logic has been moved to the
FileOrHashSource class. There are a few quirks to the original behavior,
so it was simpler to keep it a single source for now. This can likely be
simplified if we do not need to keep all of the original behavior.

For example, if the ability to load from a Hash is used solely for
testing, all of that logic could likely be removed, in favor of a config
source that only exists in the test code.
Allow the configuration to change automatically at runtime

`#load_config` is now called periodically, allowing a
custom configuration source to provide different answers
each time.
Some configuration strategies (like the default
config file source) may want to return the same
value every time until explicitly asked to reload.
The `#reset!` method on the configuration source is
called when the HUP signal is sent.

Modified the config file specs to demonstrate that
repeated calls to `#load_config` are harmless and do
not reload the configuration from disk.