The problem is that even small libraries end up with multiple public contracts that evolve independently. Trying to identify these with a single version number doesn't work. Allowing major version numbers to define interoperability is even worse. We don't see dependency hell in practice.
I understand what you mean, but for this to be manageable for the end user it should be automatized. On Debian or Ubuntu, when you install a package, all the dependencies are defined. apt-get downloads all related packages taking in account the dependencies. This could be generalized to smaller library units.
But I do like snapshot upgrades of Ubuntu because upgrading is a risky process that requires time. Geeks probably prefer the Debian way with a rolling upgrade. If something doesn't work they can fix it.
For users that are not tech savvy and don't want to fill their head with the versions and dependencies of all the packages the Ubuntu upgrade model is much simpler. The OS and all its packages do share one global version number.
I would say the choice depends on the public. Its not all black and white.