IO subsystem implementations

The IO subsystem in the framework is similar to the on in the c++ stdlib.
It makes use of stream classes and the stream operators (<< and >>) for
formatted input/output. Streams are backed by writers/readers implementing
the IWriter/IReader interface.
Stream are responsible for the formatting (and maybe buffering) while
readers/writers are responsible for the interaction with some kind of
stream medium (file, serial interface, network, ...).
Refactored logging mechanism

The logging mechanism now makes use of the OutStream class.
Basically a global logger class is registered during setup which manages
output streams. When logging an appropriate stream is
created/initialized and returned to the caller.
There are 5 log macros available, one for every log level: critical,
error, warning, notice and debug. They can be used as follows:

    notice << "This is a log at " << millis() << "ms" << endl;

For the macros to work a symbol named TAG must be available in the
current context, it will be used as the name of the log issuer.

If the requested logging level is active the macro will be
replaced by a call to log(level, tag) which in turn will request an
output stream from the system logger.
If the level is deactivated at compile time the macro will be replaced
by "if (0) log(level, tag)" thus allowing to compiler to optimize out
the statement and thus save some memory.