WIP: converting heartbeats to sockets

This is a work-in-progress branch for adding sockets to the unhangout
facilitator app, for two reasons:

  - So we can simplify the very complicated heartbeat / election process
    in the hangout app, replacing it with simple socket
    connects/disconnects.
  - So we can push messages and add collaborative content into the
    hangouts.

The approach also replaces the UI in the hangout app with an iframe,
making it easier to modify, test, and iterate it without going through
Google.

Complete:

 - Ripped out heartbeat code from unhangout routes and models
 - Added functional socket-based replacement for hangout join/leave
   logic.  We no longer pay attention to google's in-hangout list of
   participants; instead, we rely on our own sockets for that.
 - Simplified "gd" parameters passed to hangout to include just the
   session ID; communicating with the hangout app via cross-document
   messaging to inform the server of the hangout-url.
 - Added a "mock google hangout" that can be used to test session views
   and socket connections, at "/test/hangout/<session ID>/", with the
   new app appearing in the center panel.
 - Renamed several the view partials to use a convention of a preceding
   "_" when they are just for inclusion in another file.  Refactored the
   header/footer code so that it can be shared between event, admin, and
   hangout app.  Also renamed event-specific ``app.js`` and ``views.js``
   to ``event-app.js`` and ``event-views.js``.

Still TODO:

 - More complete testing to ensure all the complicated variations on
   joining/leaving of sessions in various states works as expected.
   Enumerating these possibilities would assist in developing a test
   suite.
 - Testing with permalinks (e.g. event-less sessions).
 - Handling server restarts properly with the hangout-app socket code.
Merge youtube URL branch
Tested and functioning socket-based facilitator

Changes:

  - Session participant data is now stored as a (denormalized)
    serialized user object instead of just a participant ID -- so it's
    ``session.setConnectedParticipants(userdata)``, not
    ``session.setConnectedtParticipantIds(ids)``. This seemed the
    simplest way to fix issues with missing user data in the Event
    dashboard when someone joins a session without the event page open.
  - Session ``connectedParticipants`` are cleared when loading from
    Redis for the first time.  Loading from redis means that the server
    has restarted -- and all socket connections will need to be
    renegotiated anyway, which will re-populate
    ``connectedParticipants``.  We might also consider just refraining
    from ever persisting that key -- but clearing it on load is easy for
    now.
  - Switched the test socket client to ``sockjs-client-ws``, which uses
    websockets instead of XHR.  The node XHR socket client was throwing
    random disconnects -- we'll want to evaluate carefully that this
    doesn't cause issues with room connections in real browsers using
    XHR.
  - Corrected a couple Tag issues (e.g. ``<ul><div></div></ul>``) on
    events page.
  - Added socket reconnection to facilitator.
  - Added a server restarting routine for testing what happens when the
    server is restarted.
  - Refactored room manager tests to be less insane, and to work with
    the more exacting ``sockjs-client-ws``.
  - Removed heartbeat-oriented tests.
fix test name
Add load simulator script

Fire up the load simulator by running ``bin/load-simulator.js``. Point
your browser to the URL for the first event (probably
``http://localhost:7777/event/1``), and you'll see lots of chat,
blurring, focusing, joining and leaving of the event.  Open up the
sessions, and people will join and leave those too.

Note: overrides SSL setting to not use SSL, so the mock users' sockets
can all connect properly without certificate validation issues.
Minor cleanup of load-simulator
Merge branch 'socket-facilitator' of https://github.com/drewww/unhangout into socket-facilitator
Add NODE_ENV to forever scripts
Merge branch 'socket-facilitator' of https://github.com/drewww/unhangout into socket-facilitator
Fixes for session redirects and facilitator
Fix errors on null events; iframe CDM
Add tests for hangout sessionr edirects
Fix baseUrl port checks
Fix merge
Add participant tracking to gadget, facilitator

Gadget now posts a cross-document message to facilitator every 5 seconds
with the currently connected participant data, to be eventually used to
update ``session.connectedParticipants`` to include users who join the
hangout without the app.
Track participants who join hangout but not app
Restrict session messages to sockets in the room
Activities in unhangout facilitator
Select newly added activities by default
Implement 'hide app' button in facilitator