refactor index serialization
minimize copying on reads

Instead of returning a byte slice for the key and value, return an
io.SectionReader for each. This allows the indexing code to avoid reading the
value, and the serving code to avoid reading the key (as well as the extra copy)