[SPARK-4789] [mllib] Standardize ML Prediction APIs

This is part (1) of the updates from the WIP PR in [https://github.com/apache/spark/pull/3427]

Abstract classes for learning algorithms:
* Classifier
* Regressor
* Predictor

Traits for learning algorithms
* ProbabilisticClassificationModel

Concrete classes: learning algorithms
* LinearRegression
* LogisticRegression (updated to use new abstract classes)

Concrete classes: other
* LabeledPoint (adding weight to the old LabeledPoint)

Other updates:
* Modified ParamMap to sort parameters in toString

Test Suites:
* LabeledPointSuite
* LinearRegressionSuite
* LogisticRegressionSuite
* + Java versions of above suites

CC: @mengxr  @etrain  @shivaram 

For optimizing storage, I think we can do it in either case (Vector for weakly typing, or Array[Double] for strong typing).

I too agree both options are good & just wanted to hash out the pros & cons.

> Is there really a case where the user doesn't know schema types, suggests a type, and lets the framework override it?

That's not quite what I meant.  I was thinking of 2 use cases:
1. An expert user specifies types.  The algorithm should use those types.
2. A beginner user does not explicitly specify types, but uses the typed API so that loaded data are given default types (probably continuous).  Following the first case, the algorithm should use the given types, but following intuition, the algorithm should infer types.
This is less of an issue if the typed interface is designated as an expert API.

I'm starting to wonder if the typed interface should be completely public.  I'll move this to a non-inline comment so the rest of our discussion does not get hidden in the future.