[SPARK-4754] Refactor SparkContext into ExecutorAllocationClient

This is such that the `ExecutorAllocationManager` does not take in the `SparkContext` with all of its dependencies as an argument. This prevents future developers of this class to tie down this class further with the `SparkContext`, which has really become quite a monstrous object.

cc'ing @pwendell who originally suggested this, and @JoshRosen who may have thoughts about the trait mix-in style of `SparkContext`.
Actually, one comment here: it might be nice to document the return type.  It looks like the scaladoc in CoarseGrainedSchedulerBackend already does this.