Implement an actual Compiler pipeline, use it to simplify test matchers

All I wanted was implementing failNamingWith without code duplication, it kinda escalated from there...
If we want to support warnings, maybe we should make this a `(Option[Phase[_]], List[Finding])`