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.
And yes, it goes outside the scope of this PR, but one of the things that bugs me about the Spark code is how frequently we directly create threads with `new Thread` instead of with some standardized factory and perhaps with better defined and utilized thread pools.