Collection Architecture
-----------------------

Collection is a container for a set of objects that collectively provider tracks to the application. 
It does this by providing Meta::Base derieved objects via the QueryMaker (which every collection has).

On plugin load a CollectionFactory is registered with CollectionManager which listens to the
newCollection() signal. CollectionManager is responsible for integrating the new Collection within
the rest of the application. Collection makes user visible strings, icons and other information
available for the UI to use.

TrackProvider actually creates the Meta::Track objects using trackForUrl() which has a specially
formatted URL that is unique accross application settings. A collection has it's own URL protocol
which all uidUrl's of the collection's tracks start with.

For getting tracks according to metadata or statistical information each Collection has a QueryMaker
implementation. Any component can get an instance of this specialized QueryMaker using Collection::queryMaker().
CollectionManager has a special QueryMaker that will return results of all the registered collections
using their queryMaker(). Use this if you want a track resolved without caring about it's origin.

TrackProvider and QueryMakers can be used seperatly from the collections. In practice though you'll
find only TrackProvider getting used by Services and the filesystem browser. If needing to combinine
it with a QueryMaker you are probably creating a Collection anyway.
Also note that Collection objects don't use shared pointers so they are not especially well protected
against getting removed. Holding the pointer to a QueryMaker for a prolonged amount of time
invites problems (e.g. when the usb device is removed. We had a number of bugs for this)

