Make FsHistoryProvider keep a map of applications by id.

This makes it more efficient to search for applications by
id, since it's not necessarily related to the location of
the app in the file system.

Memory usage should be little worse than before, but by a
constant factor (since it's mostly the extra overhead of
a LinkedHashMap over an ArrayBuffer to maintain the data).
Wait until master responds before returning from start().

This allows the application ID set by the master to be included
in the SparkListenerApplicationStart event. This should affect
job scheduling because tasks can only be submitted after executors
register, which will happen after the client registers with the
master anyway.

(This is similar to what the Mesos backend does to implement
the same behavior.)