Create infrastructure to store diagnostics to flush later

Borrowing a nice idea from Clang, I've added a CheffeDiagnosticBuilder,
which makes report() return a temporary variable which builds up
diagnostic information and flushes it in the destructor.

This will later be modified to store the message into a vector, and so
the driver can choose whether or not to flush diagnostic messages.
Useful for things like unit tests where we don't necessarily want to see
error messages.

Current drawback in implementation: can't chuck std::endl into report()
any more.