Use a single tagged exception instead of a hierarchy

Everyone is busy so I'm taking over #844 :) Should have this sorted tonight.

TODO
- [x] Update all the raise sites.
- [x] Update all the tests.
- [x] Poke wording in error messages.