Add `Logger` and `NullLogger`

This adds a `Logger` utility and a `NullLogger`. These will be
used to handle summary and verbose logging. This uses a null
pattern depending for whichever logging is not "turned on". In
verbose mode, the summary method returns a null logger which will
accept all the logging calls but won't do anything with them. When
in summary mode, this is reversed.
wip