SPARK-2099. Report progress while task is running.

This is a sketch of a patch that allows the UI to show metrics for tasks that have not yet completed.  It adds a heartbeat every 2 seconds from the executors to the driver, reporting metrics for all of the executor's tasks. 

It still needs unit tests, polish, and cluster testing, but I wanted to put it up to get feedback on the approach.
The way this is designed it seems like the TaskMetrics objects will be modified by the Executor while also being serialized by Akka to send over the wire. Am I missing some synchronization or copying somewhere? Or are we assuming that all the fields in TaskMetrics will be atomically set with immutable objects?

What happens if someone adds a field to TaskMetrics that is mutable, e.g. a HashMap or something, and then we are serializing it as we mutate it?