Initial groundwork  for retrieving settings from multiple profiles. Doesn't actually load profiles or anything useful like that yet.
Oops. Walk the profiles in reverse so the most recent profile takes precedence instead of the base config.
Fix typo.
Initial support for updating settings in profiles.
Add support for loading and saving profiles.
Never save config profiles if running on secure desktops.
Add get and __contains__ methods for the aggregated config classes, as both methods are needed by braille.
Teach AggregatedSection how to resort to defaults specified in the config spec.
ConfigManager can now load the base config by itself without relying on the old config loading code.
AggregatedSection: When the config spec is replaced, ensure it remains linked to the main spec.
ConfigManager: Resort to factory defaults if loading the base configuration fails.
Add comments.
AggregatedSection: Handle assignment of a section to a key.
ConfigManager: Add reset method to reset to saved config or factory defaults.
Switch to using ConfigManager!

config.load has been renamed to config.initialize, as it initialises ConfigManager.
Saving hasn't yet been updated.
AggregatedSection: Implement iteritems and copy methods, as they're needed by some NVDA code.
Make saving configuration work.
AggregatedSection.iteritems: Handle the case where this section doesn't exist in a given profile.
AggregatedSection: Add isSet method to determine whether a setting has been explicitly set.
synthDriverHandler: When setting the synth, use AggregatedSection.isSet to determine whether to load settings or initialise with new ones.

This is necessary because we want to use the initial values from the synth itself as defaults, not the defaults from the config spec.
Fixes the volume and other settings being set to 50% when resetting to factory defaults.
Create the profiles directory along with other config directories.