Implement Track Changes

@stephensanchez please. I'll be on vacation next week, but @caesar2164 and @stvstnfrd will be around and can handle our end of the PR process.

* Creates "TrackChanges" django model, which ties a (submission_uuid,
  scorer_id) pair to a set of edits suggested by peers for a particular
  submission.
* Adds machinery for on-the-fly installation of the New York Times's ICE
  library for collaborative editing, allowing peer assessors to create
  marked-up versions of submissions, which can then be returned to the
  author as feedback.
* Adds machinery for displaying suggested edits to the creator of a
  submission with their scores and other feedback.
* Configurable within Studio on a per-Assessment basis by including a
  URL to the ICE library as part of the assessment definition.
* For additional details, see:
  https://docs.google.com/document/d/18PITJu133sFpDl_B2GCbo2eb0GODcwVmVsktwPQfVSg/edit?usp=sharing

Co-authored-by: Giulio Gratta <giulio@giuliogratta.com>
Co-authored-by: Steven Burch <stv@stanford.edu>
Co-authored-by: Joe Blaylock <jrbl@jrbl.org>
This is actually a different use case.

What's happening in `oa_shared.js` is that we're stubbing out methods
that may not have been provided by the runtime environment.

On the other hand, here in `oa_trackchanges.js`, the `ice` object _must_
exist. It will exist regardless of the runtime environment in which this
method is executed, since we're including it explicitly and _not_
relying on the runtime to provide it for us (as is the case with i18n,
etc.).

In the off case that it was _not_ present, the code _should_
fail here. It will not `fail in an obscure way`; we'll receive a
`ReferenceError: ice is not defined` (or browser equivalent).