[RFC] Break out/refactor package selection

I find the selectPackages() part very hard to understand or to test. 

This PR attempts to break it up into smaller pieces, namely:
* A `PackageSelection` class which tracks the packages that are to be processed
* A `LinkResolver` which can follow dependencies from the current `PackageSelection` and add more packages if needed
* `LinkProviders` that know which dependencies to follow for a given package
* `FilteredPackageSelection` which helps in the case of "filtered builds".

Feedback is welcome, but please let's try to focus on fundamental issues before discussing CS glitches.

Thanks!