ttools: rework taplint error reporting for static code determination

The taplint Reporter.report() method now takes a ReportCode rather
than a ReportType and a String.  The ReportCode encapsulates a
ReportType and a String.  However, most ReportCode instances are
now supplied from an enum class (FixedCode).

The point of this is so that programmatic clients of the taplint API
can find out up front which messages may be emitted.  The list is
not complete, since some are generated dynamically at runtime, but
most are available from FixedCode.values().

This was done to satisfy the requirements of the registry service
validation framework being developed by Menelaus Perdikeas at ESAC.
ttools: taplint now prints startup announcements

Announces its version and the number by report type of FixedCode reports
it knows about.