Better support for version constraints.

Each version requirement stores a maximum and minimum version.  Version
compatibility is determined between two version requirements if there is
overlap between their min and max versions.