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)
fill in File#Readdir and File#Readdirname

also, iron out some issues around trailing slashes, and add a bunch of tests.
correctly pass the expected argument first in calls to assert.Equal