feat(blockstore): implement blockstore

This PR adds a simple `datastore` wrapper so we don't need to repeat boilerplate pack/unpacking in places where the datastore is used.

```
type Blockstore interface {
	Get(u.Key) (*blocks.Block, error)
	Put(blocks.Block) error
}
```

> How is this different from the `blockservice`?

The `blockservice` falls back to querying the `exchange` (bitswap) when values aren't present in the `blockstore`.

> Where does this belong?

I'm not so sure myself. Either as a top-level package or as as `util/blockstore`. Due to circular dependencies there are a number of places where it certainly cannot go (`dht`, `bitswap`, `blockservice`, etc.)
Also, since we are vendoring multihash, we should do our due dilligence to make sure we arent updating a version of a lib that may break our code.