implement StreamAligner#single_raw_data
display alignment time in output log
optimize StreamIndex#marshal_* methods

Use pack/unpack instead of Marshal to save the (huge) index arrays.
remove duplicate code between step and advance
avoid a few expensive method calls in #data_header

It regroups three calls to IO#read into a single call, and avoids
two calls to IO#tell
allow to specify a buffer to fill in Logfiles#data
reuse always the same buffer in Logfiles#data_header

Logfiles is definitely not thread safe, so that makes a lot of
sense to reduce GC pressure.
reuse always the same buffer to read data from disk in DataStream#raw_data
allow reusing the same sample when reading data
fix wrong local variable name

The variable is holding marshalled data, not unmarshalled data
provide a fastpath to read data samples

When using the stream aligner (and in general, the dense indexes),
we really do not need to read and unmarshal so much data anymore.
Simply go straight for the payload.
stream_aligner: avoid sorting the streams TWICE

All samples were sorted once during the index building and
a second time during replay. This is obviously bad from a
performance point of view in the common case (calling #advance)
Simply save the information that #advance requires in a dense
index and use it in #advance