fix a couple bugs around seeking

- make sure we align ourselves to the right offset when reading a block.
In the case that our offset isn't even with a chunk, the datanode will return
data starting at the previous chunk, so we need to discard the extra bytes.

- when seeking to an offset relative to the end of a file, add rather than
subtract the offset specified (which is correct, because Seek(-10, 2) should
seek to 10 bytes from the end)