Blob: implement the memory buffer interface

This allows us to expose access to the blob's data without the need to
copy it into new buffer.

Should we take `Blob.data` and make it return a `memoryview` of the data instead of creating two ways o accessing it? I'm not too familiar with any differences in how you might want to use a PyBytes vs a memoryview.