[SPARK-1768] History server enhancements.

Two improvements to the history server:

- Separate the HTTP handling from history fetching, so that it's easy to add
  new backends later (thinking about SPARK-1537 in the long run)

- Avoid loading all UIs in memory. Do lazy loading instead, keeping a few in
  memory for faster access. This allows the app limit to go away, since holding
  just the listing in memory shouldn't be too expensive unless the user has millions
  of completed apps in the history (at which point I'd expect other issues to arise
  aside from history server memory usage, such as FileSystem.listStatus()
  starting to become ridiculously expensive).

I also fixed a few minor things along the way which aren't really worth mentioning.
I also removed the app's log path from the UI since that information may not even
exist depending on which backend is used (even though there is only one now).
Also remember that the method that would generate the UI has to contain pretty much all the code from the method that generates just the listing info, since it needs to get the view acls. So while it may be "just a few lines", it's the concept of duplicating all this knowledge that bothers me.

As for the SparkUI, I was suggesting that the class itself should be a SparkListener, and then its construction would be decoupled from the bus. Internally it can fan out events to whatever listeners do the actual work, but that would keep its interface cleaner.

(Or optionally have some sort of "registerListener(SparkListenerBus)" method, as long as the bus is not passed to the constructor.)