[SPARK-4857] [CORE] Adds Executor membership events to SparkListener

Adds onExecutorAdded and onExecutorRemoved events to the SparkListener. This will allow a client to get notified when an executor has been added/removed and provide additional information such as how many vcores it is consuming.

In addition, this commit adds a SparkListenerAdapter to the Java API that provides default implementations to the SparkListener. This is to get around the fact that default implementations for traits don't work in Java. Having Java clients extend SparkListenerAdapter moving forward will prevent breakage in java when we add new events to SparkListener.
I'm on the fence about whether this should be a case class or a regular class.  If it's a case class, then Scala users can pattern-match on it, but we risk introducing binary incompatibilities if we ever need to add new fields to this event.  If we had to re-do the SparkListener API, I'd probably opt to not use case classes for this reason.  In light of this, do you think we should we adopt a "no new cases classes" policy for new listener events?