`Enumerable#max` takes a block. We can absolutely have the return value be a `Gem::Version`.

The other thing I'm rapidly considering _over_ RubyGems here is relying on [solve](https://github.com/RiotGames/solve) instead for both constraints on individual versions and constraints for dependency resolution.