Wide refactoring of WebUI, UITab, and UIPage (see commit message)

The biggest changes include
(1) Decoupling the SparkListener from any member of the hierarchy. This was
    previously arbitrarily tied to the UITab.
(2) Decoupling initializing a UITab from attaching it to a WebUI. This involves
    having each UITab initializing itself instead.
(3) Add an abstract parent for each UITab. This allows us to move the access
    of header tabs of the UI into the UITab abstract class itself.
(4) Abstract bind() logic into WebUI.
(5) Renaming UITab -> WebUITab, and UIPage -> WebUIPage.