[SPARK-4949] [SPARK-4949] shutdownCallback in SparkDeploySchedulerBackend should be enclosed by synchronized block.

A variable `shutdownCallback` in SparkDeploySchedulerBackend can be accessed from multiple threads so it should be enclosed by synchronized block.
On the one hand, this sounds like it could be an `AtomicBoolean`. On another hand -- this whole mechanism could be replaced by something more robust in `java.util.concurrent`