Types in this class are all notions of a package. This allows us to have
different types for the different phases that packages go though, from
simple name/id, package description, configured or installed packages.

So for example a not-yet-configured package has dependencies on version
ranges, not specific versions. A configured or an already installed package
depends on exact versions. Some operations or data structures (like
dependency graphs) only make sense on this subclass of package types.