Refactored VersionRange to decouple it from Version implementations.

VersionRange is now an interface where each implementation represents a
different constraint system, rather than having each implementation be
coupled to a specific Version implementation.

Currently, the only VersionRange implementation is IntervalVersionRange.
Added a TODO for a future enhancement.