ExecutorUI: render completely from JSON

Additionally, this commit fixes the bug in the local mode, where executor IDs of tasks
do not match those of storage statuses (more detail in ExecutorsUI.scala).

This commit currently does not serialize the SparkListenerEvents yet, but instead
serializes changes to each executor JSON. This is a big TODO in the upcoming commit.