Generalize BaseCoverageReporter to BaseViolationsReporter

This enables a later move to pull PEP8 and Pylint violation reports in
via the same API.

The report generator would still need work to display those reports
correctly (for instance, displaying the messages in each violation, and
displaying multiple messages per line).