Moved the startup logging code around.

This will help me time how long it takes to startup miro better.
Refactored the startup checks code

I think it makes sense to put them in the same class since they're so
closely tied together.  Also made it so in the normal case, we don't
use any idle callbacks.  I'm not sure if this will make a big
difference, but it could be faster and it doesn't hurt anything.
Added some debugging printounts for startup times
Startup cleanup phase one.

Moved a bunch of code to run later on in the startup process.  The
idea is to make as little as possible run in the backend until we have
our window up.

Renamed some of the functions in startup.py and added docstrings.

Don't setup app.transcode_manager.  We don't actually use that
anywhere.
Wait until the frontend is started up to run icon cache updates
Wait until the frontend is started to setup the device tracker.

Made device tracking implicit.  The frontend no longer has to send the
TrackDevices message.
Don't track shares until after the frontend has started
Load search engines lazily

Loading engines actually takes a somewhat large amount of time, so we
shouldn't do it until we need to.
Another sharing speedup.

Defer calling mdns_init() until we really need to.
Don't load the progress bar inactive surface.

It takes a non-negligable amount of time and we don't actually use it.
Fix for startup when search engine not set to all

I noticed on my mac book that this made miro crash during startup, since the
_engines attribute wasn't set up.  Fixed the crash and also changed it so we
call calc_urls() lazily.
bz19812: don't group items together with no album/artist info