On Versions:
So we don't really need these anymore but they can be used to provide a
solution to garbage collecting of mutable chunks.
Extend the Storage interface to have a copy operation taking a ContentId and
a Version. This can be naively implemented as creating a uuid, copying to that uuid,
and storing a (ContentId, Version) -> Uuid map.
Change the delete operation to take an Option<Version>.
copy can be efficiently implemented by just incrementing a refcount and
decrementing when receiving a versioned delete
Add a promote operation which deletes all versioned copies and creates a
non-versioned one if it doesn't exist already
save chunks as uuids?
// for fs::write
have initial write possibly return reserved if the chunk is immutable
do the same WriteResult stuff
on reserved, fetch/read? the data and feed it back
writers should block on reserved state