Completely decouple SparkUI from SparkContext

This involves storing additional fields, such as the scheduling mode and the app name, into the
new event, SparkListenerApplicationStart, since these attributes are no longer accessible without
a SparkContext. Further, environment information is refactored to be loaded on application start
(rather than on job start).

Persisted Spark UI's can no longer be created from SparkContext. The new way of constructing them
is through a standalone scala program. org.apache.spark.ui.UIReloader is introduced as an example
of how to do this.