change io-interface around to take an arbitrary parameter.

instead of hardcoding in metadata; now we essentially have a
closure, albeit only in the weak form possible in C.  Every
io-interface wanted something different; stuffing it all into a
'metadata' struct would either get unwieldy (gigantic struct to
deal with, lots to copy in/out of it) or arbitrary limit what can
be done.
add two new io-interfaces.

the first is a simple 'debug' interface: it basically just prints
out what it was asked to do.  kind of lame, because then your IO
interface won't actually *do* anything, which is why...

the second is a 'chaining' interface.  it takes two functions and
constructs an io-interface which is defined to be the functions
running in series.  this lets one chain (for example) 'DebugIO'
and 'StdCIO', so that the io-interface prints out what it does as
it actually does it.