Changed the way that Profile, Config, and Storage interact

In an effort to remove as much boilerplate as possible, I've moved added
a few methods to the `freeseer.framework.config.profile.Profile` class.

`get_database(filename)` should be used to fetch a `QtDBConnector`
instance for filename. It will automatically figure out where this file
should be created based on the profile.

    profile.get_database('presentations.db')
    # ~/.freeseer/profiles/<profile_name>/presentations.db

`get_storage(filename)` will get a ConfigStorage instance for the file.
Additionally, it will pick the ConfigStorage subclass it uses based on
the file's extension. You can/should use the instance it returns to
store/load Configs to/from that file.

    storage = profile.get_storage('freeseer.conf')
    storage.load(FreeseerConfig(), 'Global')
    storage.store(FreeseerConfig(), 'Global')

`get_config(filename, config_class, *args, read_only)` will get the
ConfigStorage for filename and then do a `storage.load` on it. It will
return an instance of `config_class`.

    config = profile.get_config('freeseer.conf', FreeseerConfig,
                                ['Global'], read_only=False)

`Config` instances will now provide a `save` method to persist them
using whatever `ConfigStorage` loaded them. If you set `read_only=True`
in the above example, it will enable this. To do this manually, all you
need to do is pass the `ConfigStorage` instance and the arguments that
its `store(config, ...)` method takes as arguments to its constructor.

    storage = profile.get_storage('freeseer.conf')
    config = FreeseerConfig(storage, ['Global'])
    storage.load(config, 'Global')
    config.save()
Updated the main Freeseer apps to support the new Profile stuff

The client / server controller app was omitted because a lot of the code
dosen't make sense. It also seems like it could use a makeover before I
do any additional work on it.
Updated existing testcases to work with the Profile changes