Avoid indirection caused by passing shared_ptr by reference
The block factory does not have responsability on the lifetime of their inputs
Define std::make_unique when using C++11 and make use of it
Printers are turned into unique_ptr to express ownership
Printers do not participate on the lifelime of the data, so they take const raw pointers
Modernize tests code