Initial work toward a global message port/loop.

Create a single message port to be shared in the view controller, and
run a main message loop in the controller. Eventually the idea is to
just have this single message loop, but it's a massive change and this
is just the beginning. The basic grid screen and simple data loaders
have been updated to use the new methods. Everything else, including
the home screen and the grid screen with search data loader, is still
pending.
Get the home screen working with the global message loop.

This is a fairly big and horrifying change, but it's actually made up
of several parts that hopefully make sense.

First, instead of the home screen being a confusing combination of a
Screen and DataLoader, whose Screen is actually another wrapped screen
rather than a native screen, the responsibilities have been separated.
The home screen is now a regular GridScreen with just a couple tweaks,
like changing the style and up behavior. All of the trickiness was always
in the custom data loader, and so that has been separated into its own
object/file.

Second, in order to handle GDM in the global message loop we need a way
to listen for socket events. This works basically the same way as URL
events. Objects register to be notified of socket events on a particular
socket; the view controller looks for a registered listener when it
receives a socket event.

Third, in order to show the help screen after several seconds of hoping
for GDM to find a server, we need a timer concept. This also works
somewhat similarly to the URL events. The old performance timer abstraction
has been generalized into a Timer object. Objects can register timers
with the view controller. On every event, the view controller checks
to see if any timers have expired and notifies the object that registered
the timer. The view controller is also able to check all of the timers
in order to set an appropriate timeout on the global wait call.
Fix grid reloading.

Let screens know when they once again become visible. Use that hook in
the grid screen to do the reloading that we used to do after showing
the child screen. Now that we have a shared message loop, showing the
child screen returns immediately.
Convert poster screen to use global message port.
Convert search screen to use global message port.
Update the search data loader to use the global message port.
Update keyboard screen to use global message loop.
Convert enum screen to use global message port.
Convert channel settings screen to use global message port.
Convert all preferences screens to use global message port.

The only laggards are a couple of things implemented in other files. The
myPlex pin screen isn't really tackled yet, nor are the log download dialog
or GDM discovery.
Add support for POST requests through the view controller.
Convert myPlex pin screen to use global message loop.

Rip the pin screen out of the myPlex manager and into a proper screen object,
and then make it use the global message loop.
Fix a bunch of stupid stuff from when I didn't have access to a Roku.

Turns out it's really hard to write mistake-free BrightScript without being
able to run the code. Who knew?
Make sure the logo is always shown next to the connect/disconnect myPlex option.

We were changing the entire item instead of just the title, so we were losing
things like the poster URL.
Fix automatic GDM discovery.
Convert the photo springboard and player to use the global message port.

There has always been a lot of shared code for the three springboards, but it's
always been a bit messy (my fault). This tries to clean that up a bit. There's
now a much more explicit base springboard screen which will be extended by the
photo/audio/video varieties. The players will also be distinct from the
springboards in this enlightened new world. We're not taking advantage of that
yet, except to the extent that it's more consistent to have one of our "Screen"
wrappers around an roSlideshowScreen, but to use a simple example there's no reason
not to launch a slideshow directly from the grid screen if the user hits the
Play button on the remote. Previously that was all but impossible, but it should
be quite trivial after separating the player from the springboard.
Rework audio springboard and player to use global message port.

This is another big change, but it's consistent with the idea of the
rest of the global message port changes. Continuing on the work for the
photo screens, the audio springboard extends the base springboard
and is a fairly normal screen. The audio player is a separate object
and mostly independent of the springboard screen. Among other things,
this will allow background audio playback. Sort of as proof of that,
the channel will currently leave the music playing when you leave the
springboard. This is far from ideal as-is though, as there's no way
to bring up audio player controls once you leave the springboard
screen.
Pass audio player events along to the audio player.
Convert video springboard/player to use global message port.

This is just like the previous changes for photos and music. Among other
things, the separation of the video player from the springboard screen
will eventually allow us to start a video player from anywhere, like
hitting Play on an item on the grid screen.
Fix progressive search suggestions.