Build arbitary tables from data sources

Added support for building arbitary tables. Tables are composed from
columns, each of which is subscribed to an arbitrary number of data
sources. The only restriction on data sources is that must implement
Iterable.

Columns receive the data source items (gotten by calling next() on the
data source's iterators) one-by-one and report back their values by
returning a Map when consumeResultingTableRows() is called.  Two types
of columns exist: "normal columns" and "global computation columns".
The first type is expected to return a new value after each read data
source item (but doesn't have to; all "expect" means is that
consumeResultingTableRows() is called after each new item is
reported), while the second type is expcted only to be able to return
values after all the data source items have been reported to the
column.

Implementation uses mapdb. No realistic tests have been performed so
far.