Allow grouped constraints

This PR has mainly been worked on by @malukenho, so please ping him as well for questions, if you have any. 

The final aim is to support grouped constraints such as:

 * `(<10|>2),(<5|>3)`
 * `(>3.5,<3.6)|(>4.5,<4.6)`

This simply completes range selection logic in the version matching logic, allowing for constraint concatenation.

Functional tests for the installer should probably also be included in order to verify that the `MultiConstraint` is being used as expected with complex ranges, but these should come after an initial review.

There are a lot of commits, since this is the first attempt by @malukenho to write parser logic, and the development already went through numerous feedback loops. 

Additional complexity is introduced as well, but at least we moved away from a lot of regex-foo that we could hardly understand ourselves while working on this.
To be discussed: if a dependency is not desired, we can copy-paste the logic into the implemented lexer