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.
Also it seems like now the listener and all downstream code needs to expect `TaskMetrics` objects that have potentially null fields. For instance a TaskMetrics object could be created and then instantly serialized before any of the fields are populated.

A lot of the code downstream doesn't makes the assumption that TaskMetrics will have only filled-in values. I just checked the Json serializer for TaskMetrics and also the web UI, both of them will throw exceptions if there are null fields here.