Strict constraints now reject both lower and higher versions A strict version constraint is implemented by preferring any version in the declared range, and rejecting other versions. Rejecting of lower versions happens naturally through the `LatestModuleConflictResolver`.
With this change, the rejection of lower versions becomes explicit, instead of building a range higher than a strict constraint and rejecting that, we instead create a 'inverted' VersionSelector that will matches the exact complement of the `strictly` version selector, and reject that.
This change will later permit us to remove the implicit 'reject all lower' constraint in our resolution engine.
Strict version constraints are now rendered as 'strictly' in error messages.
Retain separate versions for 'strictly' and 'prefers' Previously, a `strictly` version constraint was translated into a separate 'prefer' and 'reject' constraint: this is how it was processed internally, as well as how it was represented in a `.module` file.
With this change, strict version constraints are logically retained as a first class version constraint: - `.module` files can have versions declared with `strictly` - Strict constraints are only translated to a reject version selector as part of resolution (not when parsing the constraint)