Break out dispatch from report in consistency check.

`ConsistencyReport.forReference(...)` was tricky to implement and didn't quite fit in with the other
methods in the ConsistencyReport interface. This change breaks that method out into a CheckerEngine
interface. CheckerEngine also holds/creates the ConsistencyReport instance, to avoid creating report
objects (dynamic proxies through reflection) unnecessarily.

This allows us to remove the generic parameters of ConsistencyReport, which makes it possible to report
on things that are not records.

Authored by Tobias & Lasse.