Implement a new, more flexible printer.

The new printer can output to any number of streams, and filter using lambdas,
by tags or message content. Messages can now be tagged with relevant tags.