The ideal solution is that we don't leak internal dependencies to clients, right
Yes, this would be ideal.
This isn't a unique problem to solve, nor is it an easy one.
Sadly, I know.
If we shade guava into solr-core, then contrib-1 can use "real" guava X and contrib-2 can use "real" guava Y.
My initial assessment didn't take into account that hdfs libraries are already part of Solr's lib (and thus common classloader). So there's no easy way to eradicate that old guava unless you repackage all the JARs in WEB-INF/lib.
Also, there's a single class loader is per core (not per contrib) so any JARs from contribs are loaded into the same class loader. (That's what the code looks like in MemClassLoader and SolrCore... correct me if I'm wrong).