Stop using multiprocessing.dummy.Pool

This implements a custom job queue with workers based on threads.
Collection discovery is now done in a separate thread.

See #124

- [x] Fix tests
- [x] Document max_workers
- [x] Deprecate processes
- [x] Don't sync collections more than once
  - [x] Add tests