add a test for data integrity
fix some cases where we aren't returning EOF in BlockReader
fix a bug causing inconsistent reads

Because the underlying bufio.Reader in BlockReader sometimes returned a smaller
number of bytes than we were expecting, the offsets sometimes got out of sync.
This fixes that by using io.ReadAtLeast, which makes sure we get the bytes we're
expecting (and has the benefit of turning an early EOF into ErrUnexpectedEOF)