Add fcmdr_service_list_profile_sources().

Returns a GList of referenced FCmdrProfileSource instances.
Add fcmdr_service_update_profiles().

This is the place to dump a set of updated profiles obtained from a
remote source.  The function adds or removes profiles as needed and
returns whether fcmdr_service_apply_profiles() should be called.
Add fcmdr_service_load_remote_profiles().

This ties everything together.  Given a list of profile sources, the
function calls fcmdr_profile_source_load_remote() on each concurrently.

As each profile source finishes, we call fcmdr_service_update_profiles()
to process the updated profiles, noting whether any need to be applied.

After everything is loaded, we call fcmdr_service_apply_profiles() if
necessary and complete the operation.

The return value for fcmdr_service_load_remote_profiles_finish() is a
table of (FCmdrProfileSource, GError) items for any failed subtasks.
An empty hash table means the operation was fully successful.
Hack in profile refreshing.

Use a simple timeout to invoke fcmdr_profile_source_load_remote() --
short delay initially, then refresh every hour.

Feels too simplistic -- doesn't take network availability into account
for example -- but good enough for some initial testing.