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" << endlog;

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.

Also the endlog manipulator should be send to signal the end of the log
message. This is important for more andvanced loggers that, for example,
send messages as a whole to a remote node.

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.