Make fatal DiagnosticBuilder yield `!` Fatal errors should really be fatal, so emitting them should cause us to exit at the same time. Fine with just throwing away these changes if they're not worthwhile. Also, maybe we want to use an uninhabited enum instead of `!`. r? `@eddyb` who has been working on `DiagnosticBuilder` stuff, feel free to reassign.
For high-level intro to how type checking works in rustc, see the type checking chapter of the rustc dev guide.