Refactored buckets ops to not use locks

This is important for allowing a less blocky state machine around
loading when loading itself could potentially be slow.
Strange unreachable code yielding after completion
Asynchronous bucket open machinery

This is slightly more complicated, but many buckets can concurrently be
trying to open while other buckets are being accessed.

Bucket opening can be as slow as we need it to be (http request,
retries, etc...).

Concurrent requests for the same bucket are stacked such that the
completion of opening sends the same bucket to all the participants
before registering it as a valid bucket.