Cover art support

- implement database scheme
- search for embedded cover
- search for cover in track directory
- save covers in disk cache
- search for covers in disk cache
- minimal ui (display covers in lower left corner)
- handle existing users
- LRU cache
You have a small tendency towards big feature creep functions. In you incremental updates.  It would to split up the the loading and searching into two different functions and have both run concurrently.


Moving `updateLibrary` into TrackDAO is not a bad idea. Then we can also properly inform BaseTrackCache that we changed the tracks
```C++
void requestCover() {
...
if (cover not valid) {
  coverInfo = coverDAO.getInfo();
  concurrent run -> searchForCover
  return;
}
...
concurrent run -> loadCover
}
```

searchForCover and loadCover would then both have their own clean-up SLOTs. 

To avoid designing feature creep functions always check if you function name contains everything the function does and still fits into 80 chars. If it is too long you should split up the function