Rewrote much of the persistence of onode metadata. The
highlights:
- extents and blobs stored together (the blob with the
first referencing extent).
- extents sharded across multiple k/v keys
- if a blob if referenced from multiple blobs, it's
stored in the onode key (called a "spanning blob").
- when we clone a blob we copy the metadata, but mark
it shared and put (just) the ref_map on the underlying
blocks in a shared_blob key. at this point we also
assign a globally unique id (sbid = shared blob id)
so the key has a unique name.
- we instantiate a SharedBlob in memory regardless of
whether we need to load the ref_map (which is only
needed for deallocations!). the BufferSpace is
attached to this SharedBlob so we get unified caching
across clones.