[SPARK-3266] [WIP] Remove implementations from Java*Like traits.

This PR addresses a Scala compiler bug ([SI-8905](https://issues.scala-lang.org/browse/SI-8905)) that was breaking some of the Spark Java APIs.  In a nutshell, it seems that methods whose implementations are inherited from generic traits sometimes have their type parameters erased to Object.  This was causing methods like `DoubleRDD.min()` to throw confusing NoSuchMethodErrors at runtime.

The workaround is to move the implementations of these methods out of the trait.  Ideally, I'd like to just delete the trait and convert it into an abstract class, but this technically breaks binary compatibility because it removes an interface (see #2186).  Instead, I remove the method implementations from the traits and put them in AbstractJavaDStream and AbstractJavaRDD classes that inherit from their respective traits.  This leads to a bit of redundancy, but I think it's the cleanest general solution that maintains binary compatibility.

I also improved the test coverage of the Java API.

<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/apache/spark/2951)
<!-- Reviewable:end -->