Added a parameter to LazySettings in order to allow switching the wrapped Settings class.
Introduced the SettingsCollector class which controls how the settings are collected from the settings.py module.
Minor code cleanups in order to conform to PEP8. Added a comment on my own code.
Extracted a base class for the settings collector that contains the common logic for settings collection. The SettingsCollector class now contains the default collection behavior.
Added the SettingsSourcesLoader class that is responsible for loading settings from different sources.
The default behavior and backwards compatibility is maintained.