Reworking clean symlinks and creating repo format 2

Cleaning symlinks was kludgy. I realized it could be handled more cleanly if we treated it as migrating from repo format 1 to repo format 2.

- Created format 2 of repo index (repo.json). Only difference is that the bundle state is stored as a human-readable string instead of an int ("Available" instead of "2')
- Added support for "barrier" operations in ZincOperationQueue group, inspired by libdispatch. Barrier operations runs exclusively. This allowed me to handle the special cases for GarbageCollect, BundleDelete and now CleanSymlinks more cleanly.
- Removed symlink cleaning from ZincGarbageCollect tasks and moved it into ZincCleanLegacySymlinks task. This task only runs if it reads a repo format of 1. When it finishes, it changes the repo format to 2 (current).
- Unified events for maintenance tasks
- (semi-unrelated) Increased to default download count to 5, and the network operations to twice the object download count

## TODO

- [x] Provide a way to wait for or be notified of completion of migration tasks
- [x] Consider removing "auto_update" flag in bundle tracking info