[MLLIB] SPARK-1547: Adding Gradient Boosting to MLlib

Given the popular demand for gradient boosting and AdaBoost in MLlib, I am creating a WIP branch for early feedback on gradient boosting with AdaBoost to follow soon after this PR is accepted. This is based on work done along with @hirakendu that was pending due to decision tree optimizations and random forests work.

Ideally, boosting algorithms should work with any base learners.  This will soon be possible once the MLlib API is finalized -- we want to ensure we use a consistent interface for the underlying base learners. In the meantime, this PR uses decision trees as base learners for the gradient boosting algorithm. The current PR allows "pluggable" loss functions and provides least squares error and least absolute error by default.

Here is the task list:
- [x] Gradient boosting support
- [x] Pluggable loss functions
- [x] Stochastic gradient boosting support – Re-use the BaggedPoint approach used for RandomForest.
- [x] Binary classification support
- [x] Support configurable checkpointing – This approach will avoid long lineage chains.
- [x] Create classification and regression APIs
- [x] Weighted Ensemble Model -- created a WeightedEnsembleModel class that can be used by ensemble algorithms such as random forests and boosting.
- [x] Unit Tests

Future work:
+ Multi-class classification is currently not supported by this PR since it requires discussion on the best way to support "deviance" as a loss function.
+ BaggedRDD caching -- Avoid repeating feature to bin mapping for each tree estimator after standard API work is completed.

cc: @jkbradley @hirakendu @mengxr @etrain @atalwalkar @chouqin
Correct. That's the big disadvantage of not using the internal format. It won't affect other algos as much since there is no discretization.

We have a few options:
1. Keep the implementation as is and inform the user about memory requirements.
2. Persisting RDD[TreePoint] is essential since we perform multiple passes on it during each tree construction and reading RDD[LabeledPoint] from disk every time.
3. Persisting RDD[LabeledPoint] and not caching RDD[TreePoint] during tree construction leading to repeated LabeledPoint -> TreePoint conversions for each NodeGroup.

Thoughts? cc: @jkbradley