Pinning

Looking at it here, this kind of way of using the BlockSet interface seems very weird to me. And this doesn't remove the entry from the underlying datastore.

I was thinking of something more like this:

```Go
type indirectPin struct {
  blockset  bs.BlockSet
  refCounts map[u.Key]int
}

func newIndirectPin(d ds.Datastore) indirectPin {
  // suppose the blockset actually takes blocks, not just keys
  rc := // load refCounts from d
  bs := // make bs from rc + be backed by d
  return indirectPin{bc, rc}
}

funce (i *indirectPin) Increment(b blocks.Block) {
  k := b.Key()
  c := i.refCounts[k]
  i.refCounts[k] = c + 1
  if c <= 0 {
    i.blockset.Add(b) // calls ds.Put with the block
  }
}

func (i *indirectPin) Decrement(b blocks.Block) {
  k := b.Key()
  c := i.refCounts[k] - 1
  i.refCounts[k] = c
  if c <= 0 {
    i.blockset.Remove(b) // calls ds.Delete with the block
  }
}
```