[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 

All good points. I think there's a "pro" for optimizing storage but that's a bit secondary.

I don't think a caller has to 'translate' 0/1 labels to categorical. These can be labels called 0 and 1. Given schema information, all of this is stuff frameworks can do for you. Is there really a case where the user doesn't know schema types, suggests a type, and lets the framework override it?

So, let's say my feature takes on "foo", "bar", "baz" as values. Doesn't the caller always have to translate to/from numbers? no big deal but is that simpler? I think the schema abstraction is going to help with this, I imagine.

Anyway, not really strongly arguing with you here, just completing the discussion. An array of doubles is kind of raw but certainly does the job.