better hint
Read/Write MapFile for s2_index.

Update OutputHFile to write a MapFile for the s2 index, and
HFileStorageService to read that MapFile appropriately. Details:

- MMapInputStream is a hadoop-compatible InputStream that uses mmap
  under the covers to do faster I/O.
- There are custom MapFile and SequenceFile readers that use
  MMapInputStream to get better performance.
- Since MapFile doesn't support info blocks like HFile's do, and since
  we want that info block, MapFileUtils writes a simple tsv given a
  Map[String,String] and resurrects that on reading a MapFile. This is
  kind of a gross extension to MapFile, but it is useful, and there's no
  clear clean alternative.

If this goes well we can try converting our other HFile's to MapFile's
as well. The potential advantages are:

- MapFile's look very promising as input in our MR's, so using the same
  format in our MR's and in twofishes would be nice.
- less java heap required to run a twofishes server. The machine will
  still need a lot of RAM, but the kernel may be better at handling
  memory pressure than java's GC is.
- a simpler data file format. HFile is nice, but does a lot more than we
  really use it for.

Oh, other random stuff:

- Our index building used HashSet's of thrift records, but thrift
  records in java are hard-coded to return 0. It wasn't a big problem
  because the HashSet was the value of a very selective HashMap, but we
  weren't getting anything out of the set, so I switched to a
  ListBuffer.
- Changed HFileInput from an abstract class everything inherited from to
  a normal class that everything contained. We weren't getting anything
  out of the inheritance and composition is simpler.