Embed storage status and RDD info in Task events

This commit achieves three main things. First and foremost, it embeds the information
from the SparkListenerFetchStorageStatus and SparkListenerGetRDDInfo events into events
that are more descriptive of the SparkListenerInterface. In particular, every Task now
maintains a list of blocks whose storage status have been updated as a result of the task.
Previously, this information is retrieved from fetching storage status from the driver,
an action arbitrarily associated with a stage. This change involves keeping track of
what blocks are dropped during each call to an RDD persist. A big TODO is to also capture
the behavior of an RDD unpersist in a SparkListenerEvent.

Second, the SparkListenerEvent interface now handles the dynamic nature of Executors.
In particular, a new event, SparkListenerExecutorStateChange, is introduced, which triggers
a storage status fetch from the driver. The purpose of this is mainly to decouple fetching
storage status from the driver from the Stage. Note that storage status is not ready until
the remote BlockManagers have been registered, so this involves attaching a registration
listener to the BlockManagerMasterActor.

Third, changes in environment properties is now supported. This accounts for the fact that
the user can invoke sc.addFile and sc.addJar in his/her own application, which should be
reflected appropriately on the EnvironmentUI. In the previous implementation, coupling this
information with application start prevents this from happening.

Other relatively minor changes include: 1) Refactoring BlockStatus and BlockManagerInfo to
not be a part of the BlockManagerMasterActor object, 2) Formatting changes, especially those
involving multi-line arguments, and 3) Making all UI widgets and listeners private[ui] instead
of private[spark].