This unifies some of the CLI error reporting logic. It's still not perfect, but this tidies up some minor issues that were starting to annoy me (e.g., inconsistencies in message formatting, message colorization, and exit code handling).