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.
 - 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
Generalizing initialization tasks

- Added an isInitialized flag
- Adding the ability to wait for initialization tasks
Creating a separate initialization queue
Throwing exception if bundle requested when repo not initialized
Simplifying initialization op implementation
releasing initialization queue after its no longer needed
Checking for nil queue before adding operations
Cleanups in test cases
Making some properties atomic
Initializing index with vanilla init, which uses the current format
Using NSCAssert

Thanks @JaviSoto!
Merge pull request #50 from mindsnacks/feature/repo-format-2

Reworking clean symlinks and creating repo format 2