Pluggable output (preliminary)

Some data is generated by (simulation) commands. Depending on the application
it needs to appear on the screen, in an array, in a file or should be forwarded
to another process. Sometimes it is just analysed on the fly, and acted upon.
Whichever way, this is implemented in OUTPUT plugins. Eventually adding another
file format or adding another application is decoupled from implementing yet
another simulation command.

An output plugin (usually) registers a command derived from OUTPUT_CMD with an
associated class derived from OUTPUT. OUTPUT carries a PROBE_LIST, a list of
those probes that are evaluated when producing output data.

In the traditional spice invocation
> print tran v(nodes)
"print" executes an OUTPUT_CMD. It collects the probes "v(nodes)" sticks it to
an OUTPUT object that implements printing and attaches the object to a command
registered as "tran".  generally if `output` is an output command, and `sim` is
a simulation command, then the invocation
> output sim [.. probes ..]
creates the OUTPUT object associated with the "output" formatting and attaches
`sim` command. note that there is only one (static) instance per command.

An OUTPUT object may overload these virtual functions

OUTPUT::init(int level, std::string reason)
                      initialise, e.g. allocate space. level may be used to
                      control the granularity of the output, e.g. diagnostics.

OUTPUT::head(double l, double h, string s)
                      Prepare a page or file or window to fill with data. The
                      parameters l and h specify the range of the output axis
                      and its name, respectively.

OUTPUT::commit(double X, int level)
                      Collect or print data from the circuit, usually through
                      probes, if indicated by level. X is between l and h
                      passed to head, other values can be used to send
                      supplementary data, c.f. level.

OUTPUT::flush         Postprocess data, or close file handle. Whatever is
                      needed to finalise.


The `sim` command then may call OUTPUT functions through
SIM::out_*(..).

SIM::out_set(CS&)      setup I/O, redirection etc, as specified by the user
                       provided command.
SIM::out_init(TRACE)   initialise. TRACE specifies how much diagnostics
                       to show, c.f. s__.h.
SIM::out_head          specify the layout for the next page of data.
                       as in table head
SIM::out_commit        trigger probe readings and output collection.
SIM::out_flush         signal end of page, end of table, end of chunk.
SIM::out_reset         I/O reset, low level.