Binary buffer refactor, read performance gains

We now wrap all buffer access in a buffer object which
is responsible for paging in blocks of the file and presenting
a friendly API to retriving fixed sized integers, variables
integers, and arbitrary bytes.

Switching to paging data from the file rather than doing a
disk seek & read for every event, allowed us to greatly improve
read performance for sequentially stored events:

Before:

BenchmarkMillionEventDbScan500      1000   2009240 ns/op
BenchmarkMillionEventDbScanIndex500 1000   2174500 ns/op

After:

BenchmarkMillionEventDbScan500	    1000   1275885 ns/op
BenchmarkMillionEventDbScanIndex500 500    3306566 ns/op
Optimize index scanning

The change to page large chunks of the file when scanning
degraded index scans, as they're less likely to be in the chunk
and we'll waste a lot of that data.  Now we just fetch data
on demand for index scans, improving the performance.