Major refactor of os and installer plugins and added install verb

Following recent discussion, this PR refactors install and os plugins. Based on that the `resolve` is given a major overhaul and `install` is implemented.

Some more concrete changes:

- removed "priority" based resolution and replaced with notion of "core" and "addiontal" installers
- installer and os plugins are now based on `plugin_utils` and have a more uniform API (preferring properties over getters). New base classes `InstallerBase` and `OSBase` implement some common functionality (while the abstract base classes `Installer` and `OS` contain no implementation).
- both plugin types have options, which are passed through from the config files and utilize `config_utils` for describing the structure and parsing
- only the normal `info` output goes to stdout, everything else like `error`, `warning` and `info_v` goes to stderr
- installer plugin now have a "prerequisite" abstraction for checking things like if the installer is present, if it is updated, and if resolution-specfic options are met (e.g. taps for homebrew or repositories for apt)
- installer plugins use `config_utils` to parse `installer_rules` reusing that code for improved error handling and warning the user about unknown keys (in the installer_rule)
- added option to disable specific plugins
- added xubuntu OS plugin to showcase how derivative OS's with matching versions are supposed to work
- reorganize tests to run in order unit tests, system tests, code style tests
- improved the handling and printing of "chained exceptions"
- all exception classes are now defined in their corresponding modules
- introduced XylemInternalError to wrap errors that are likely bugs, not user/config/environment errors
- improved top level error handling:
  - at the top level XylemErros are caught and printed showing chained exceptions
  - no tracebacks are shown, except in debug mode, or for XylemInternalErrors