Basic block-chain lifecycle works properly.

It is possible to allocate blocks, commit them, dispose the chain, etc and
expect it to work Properly(TM) in most obvious cases.

The block chain is a low-level construct and exposes a great deal of
information which may be useful for tuning later, eg. committable block
count vs. active block count.

Streams, both component streams and the multiplexing wrapper, are
high-level constructs and should 'just work' with minimal visible plumbing.

Some paranoia testing tools are added for exposing suspected race
conditions.

I dislike hiding away useful classes as 'internal' or 'private', therefore
the plumbing is in the Internal namespace and available to users if they
want to play with it.