Refactor error reporting

This does several error handling refactorings that I discussed with @lhkbob via e-mail.

- Make `InjectionException` the top-level exception
- Use `ConstructionException` to report errors in object construction
- Make `ResolutionException` an `InjectionException`
- Clean up and refactor messages, constructors