Fail when parsing '1.x.2' range and rework some error handling

Now raises SelParseErrors more reliably when the syntax regarding a range
(specifically explicit ' - ' ranges) instead of ValueErrors and raises
ValueErrors when the '!=' operator has been used with an xrange (because these
are no longer recognized as such).
Implement fuzzy ~ ranges with build and prerelease variants

Note: This only applies for non-xranges such as "~1.2.3-4+any".
Implement "unsatisfy" matching, "!1.2.3"