Includes moving the origin check back to templates, constructing nested template classes in each check, and making parameterized template usage.
IssueTemplate
Issue
As a result we can also make check an interface, and need to provide the check itself when constructing an issue.