MetricsListener : Remove a case of tight coupling.

Removes the tight coupling between the metrics listener and the
metrics it exposes.
I introduced a JsonReportFormatter, that does exactly that, in the
middle, so that it's possible to provide the listener with a
different set of metrics to expose.
HumanReadableReportFormatter : Makes the GetSample() method virtual.

So that people can override it and customize the source their metrics
come from.