feat: HEAD /blocks/{block_id} endpoint

Depends on #132 

on a HEAD, the block is checked for existence in the metadata store,
after which its checked for existence in block storage.

- If present in metadata, and non-existent in block storage:
     502 Bad Gateway is returned along with an explanation.

- If present both in metadata and block storage.:
     200 OK is returned along with headers such as
     x-block-reference-count

- If not present in metadata:
     404 Not Found is returned
This is simple. No need to complicate things. Both the metadata driver and the block driver has an exists function (they are no named the same, but that's not a biggie). So we really shouldn't need to change anything with the drivers at this point. Those drivers should be performing a HEAD operation and not a GET. A HEAD to swift goes to the object nodes, not the container nodes. This ensures that the object actually exists. 

Add a method to the Vault model (if it doesn't already exist): `has_block(block_id, check_storage=False)`

In the model, we check to see if the block exists in metadata. If it doesn't we return False. If it does exist in metadata and check_storage is False, simply return True. 

If check_storage is True and the block exists in metadata but not in storage, throw an appropriate exception. In my mind, this exception should belong to the storage driver, since the problem is that the block does not exist in storage.