[SPARK-4531] [MLlib] cache serialized java object

The Pyrolite is pretty slow (comparing to the adhoc serializer in 1.1), it cause much performance regression in 1.2, because we cache the serialized Python object in JVM, deserialize them into Java object in each step.

This PR change to cache the deserialized JavaRDD instead of PythonRDD to avoid the deserialization of Pyrolite. It should have similar memory usage as before, but much faster.
We have returned value here, I think is easy to 'insert' a logic between final statement before return the value, or it will be:
```
val cached = data.rdd.persist(StorageLevel.MEMORY_AND_DISK)
val model = if (algo == Algo.Classification) {
       RandomForest.trainClassifier(cached, strategy, numTrees, featureSubsetStrategy, seed)
} else {
       RandomForest.trainRegressor(cached, strategy, numTrees, featureSubsetStrategy, seed)
}
cached.unpersist(blocking = false)
model
```