Add dual to key-based record resolving.
Add ability to derive types from data.
Unbuffer import architecture.

This change makes major modifications to the import architecture. VAST used to
construct entire segments at the event sources, which introduced a lot
buffering. The key change involved building segments at the archive and letting
event sources send away chunks as they emerge. As importers send chunks to the
core, RECEIVER now performs a sync-send to the tracker to request IDs for each
chunk. It's a slightly higher message stress on the tracker, but since each
message is very small it's not a practical concern.

Also, we've renamed the original "chunk" to "block." A block is a compressed
sequence of arbitrary objects. A chunk specifically represents a sequence of
events and comes with a schema representing all event types in it. Chunks are
also cheap to copy because they are implemented in terms of CAF messages with a
copy-on-write semantics.