ExecutorUI: Serialize events rather than arbitary executor information

This involves adding a new SparkListenerStorageFetchEvent, and adding JSON serializability
to all of the objects it depends on.