upgrade bootstrap to 3.2.0
avoid KeyError
return a shallow copy of dict's items...

to avoid changes to _storage to throw a "RuntimeError: dictionary
changed size during iteration" error
ignore KeyboardInterrupt in opmuse.boot subprocess

to avoid shutting down twice :/
improved library logging
handle albums with a date of None properly

e.g. fix so unique indexes in db works properly with such values
replace sqlalchemy-utils aggregated values with own impl

also made artists.added into saved aggregated value.

also fixed some race conditions and stuff when adding albums and tracks
pep8 fix
on second KeyboardInterrupt SIGKILL cherrypy
optimize album and artist aggregated values updating
added ProfiledThread helper class
optimize slug creation in library scanning
dont wait for bgtask in queue to finish when shutting down

i'd like to serialize the queue to the db and then just requeue it on
next boot, but i can't be bothered right now so this seems like a better
alternative than we had before at least.

the only caveat with this is that bgtask cache values wont start again
until the 30 minute keep value cache has run out
updated screenshot
add not null constraint to artists.name
update aggregated values every 1000 tracks
memoize fetching of entities when search querying
don't memoize when outside of a request
allow aggregate updates to run before library thread is stopped
use recent_tracks (e.g. listened_tracks) for top artists

and don't fetch monthly top artists from lastfm anymore

also this means that top artists is weekly and not monthly now