Quiz taking: reliable auto-submission

The big change: on browsers that support it (everything except IE8 and
9), we now use a Web Worker for time-limit checks. This is much more
reliable cross-browser than plain setInterval() when tabs are
inactivated as the workers are spawned in an actual background thread
and run until the parent page is killed.

This not only has the benefit of updating every X seconds consistently,
but it will also make sure the quiz is submitted when time is out, even
if the student isn't looking at the Canvas page.

The second change is a secondary defense line: when we submit, we use
either the current time, or the time at which the quiz session should've
timed out, to not confuse support that the student seems to have had
extra time when it was really just JS code being stalled.

Closes CNVS-8463

NEW STUFF
--- -----

  - r.js plugin for loading web-workers, if browser support exists,
    otherwise returns null so you can define fallback code

TEST PLAN
---- ----

  - create a quiz with 1 minute time limit
  - in Chrome, open the console tab, right click and enable the "Log
    XMLHttpRequests" option so you can see the requests we're making to
    the Canvas API
  - start taking the quiz by a student, and keep watching the console
  - tab away to some other page
    + after like 10 seconds, go back to the quiz page and verify you see
      the timer has reached 50 seconds or so
  - sleep for a while until the countdown has reached like -7 seconds
    + tab back and verify you see the "Auto-submitting in ..." dialog
    + tab away!!!
      - in 7-10 seconds, if you watch the console, you will see that the
        quiz is auto-submitting
      - if you go back to the tab, you will also see that you are no
        longer on the quiz-taking page, but are instead redirected back
        to the quiz page just as if you were on that tab

Change-Id: I640b1124de1c397dc7d7b8a2317f66917aa9328c
Reviewed-on: https://gerrit.instructure.com/41236
Reviewed-by: Derek DeVries <ddevries@instructure.com>
Tested-by: Jenkins <jenkins@instructure.com>
QA-Review: Trevor deHaan <tdehaan@instructure.com>
Product-Review: Derek DeVries <ddevries@instructure.com>