Printer objects

A little printer refactoring to migrate all the printer methods to printer objects with a consistent interface.

/cc @cored