Enforced sanity on registry and relational checks.

This is a sequence of commits which are all about keeping things sane. In particular, we no longer allow the registry to be saved unless it's in a consistent state; you can't have modules installed without their dependencies, or alongside things which they conflict with.

From a code standpoint, we now have `InstallList` and `UninstallList` as the main API points (which guarantee consistency), with the internal `Install` and `Uninstall` functionality being made private (as they do not guarantee consistency).

We may consider renaming some of the code here. `SanityChecker` was the class name that first came to mind, but really it's a relational consistency checker.

Includes many tests.

- Contributes towards #36
- Eases #78
- Closes #183
- May help with #168
- Helps with and may even close #160
- Probably completes #110