[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 

I agree with you about strong types being nice.  I think optimizations with using fewer bits should remain internal.  For the user-facing API, it's really a question about whether we want to incur some extra overhead with strong types:
* Users & developers have to write LabeledPoint[Double, Vector] or LabeledPoint[Int, Vector] instead of LabeledPoint.
  * As far as I know, we can't have default type parameters, so users could never write LabeledPoint.  (a rare time I miss C++)
* Algorithm APIs get messier to look at (passing about LabelType and FeaturesType).  This is especially annoying with meta-algorithms (boosting & bagging).

Personally, I'd be OK with heavy typing (coming from C++ land), but it might offend some Scala users.

CC: @mengxr since I know you have opinions about this