Change `Bundle` to enable a streaming interface
We have a Bundle construct that is used to gather up the sparse blocks needed to represent a given set of revisions. It is composable / mergeable with itself, which makes it nice for slurping up incremental sets of blocks for synchronization between client and gateway.
Unfortunately, gathering blocks is currently a blocking (in the order of operations) routine, and must be completed before a Bundle can be serialized or deserialized.
This means there may be cases where we allocate a lot of memory just to move a bunch of tiny blocks from one storage location to the next. It also means we may defer serialization for a much longer time than necessary while we collect blocks from storage. Let's fix this by changing the Bundle to use a streaming interface. Maybe it can be rebuilt around AsyncRead/AsyncWrite?
Aside: it may be out of scope for this issue, but our Bundle should just be a CAR.
Related: #20