[SPARK-2692] [mllib] Decision Tree API update and multiclass bug fix

Summary:
 (1) Split DecisionTree API into separate Classifier and Regressor classes. (https://issues.apache.org/jira/browse/SPARK-2692)
 (2) Bug fixes for recent multiclass PR (https://github.com/apache/spark/pull/886)
This is in preparation for a Python API (https://issues.apache.org/jira/browse/SPARK-2478)

Details on (1) API:

(1a) Split classes:  E.g.: DecisionTree --> DecisionTreeClassifier and DecisionTreeRegressor
(1b) Included print() function for human-readable model descriptions
(1c) Renamed Strategy to *Params.  Changed to take strings instead of special types.
(1d) Made configuration classes (Impurity, QuantileStrategy) private to mllib.
(1e) Changed meaning of maxDepth by 1 to match scikit-learn and rpart.
(1f) Removed static train() functions in favor of using Params classes.
(1g) Introduced  DatasetInfo class for metadata.

Details on (2) bug fixes:

(2a) Inconsistent aggregate (agg) indexing for unordered features.
(2b) Fixed gain calculations for edge cases.

CC: @mengxr @manishamde
Not obvious, IMO.  @mengxr and I talked and decided to call the learning functions "run()" in the class and "train()" in the object.  When I tried naming it "train()" in both the class and object, it caused name conflicts when calling code from Java.  I added the suffix "Sub" here because the code returns a node instead of a model, so it does not fit the "run" or "train" signature.  I am renaming it to runSub() since it is called from run().