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.
In general we strongly prefer immutable data structures because it's much easier to reason about their state. On this one I'd actually propose keeping it immutable and we can see if we need to adjust that in the future. I'd actually recommend decreasing the heartbeat interval to something like 10 seconds (or maybe less frequent) anyways. To avoid this and other problems.