v1 of the function graphing widget

Summary:
This new widget allows content creators to select a set of "Available Functions"
and have users try and graph a specific function. For example, the queston might be: "Graph
f(x) = 5 * Tan(x)", and the available function types might be "Sinusoid" and "Tangent" (both
specified with icons, rather than text, to make it more challenging). The user could then
click between the Sinusoid and Tangent templates and attempt to graph the desired function.
Currently, Linear, Quadratic, Absolute Value, Sinusoid, Tangent, and Exponential are supported,
but I'd like to add Logarithm, Cubic, and Piecewise. In addition, there should be an option
for a specific template to be active at the start (for example, if there's only one option
available and the content creator thinks it's dumb to show the single icon).
Fixes T2798.

Test Plan:
- Run Perseus.
- Create a "Grapher" widget (the nomenclature here is awful and needs work).
- Click [here](http://localhost:9000/test.html#content=%7B%22question%22%3A%7B%22content%22%3A%22%5Cn%5Cn%5B%5B%E2%98%83%20grapher%201%5D%5D%5Cn%5Cn%5B%5B%E2%98%83%20grapher%202%5D%5D%22%2C%22images%22%3A%7B%7D%2C%22widgets%22%3A%7B%22grapher%201%22%3A%7B%22type%22%3A%22grapher%22%2C%22graded%22%3Atrue%2C%22options%22%3A%7B%22step%22%3A%5B1%2C1%5D%2C%22backgroundImage%22%3A%7B%22url%22%3Anull%2C%22scale%22%3A1%2C%22bottom%22%3A0%2C%22left%22%3A0%7D%2C%22markings%22%3A%22graph%22%2C%22labels%22%3A%5B%22x%22%2C%22y%22%5D%2C%22showProtractor%22%3Afalse%2C%22showRuler%22%3Afalse%2C%22rulerLabel%22%3A%22%22%2C%22correct%22%3A%7B%22type%22%3A%22quadratic%22%2C%22coords%22%3A%5B%5B0%2C-3%5D%2C%5B5%2C0%5D%5D%7D%2C%22rulerTicks%22%3A10%2C%22range%22%3A%5B%5B-10%2C10%5D%2C%5B-10%2C10%5D%5D%2C%22gridStep%22%3A%5B1%2C1%5D%2C%22snapStep%22%3A%5B0.5%2C0.5%5D%2C%22availableTypes%22%3A%5B%22linear%22%2C%22quadratic%22%2C%22absolute_value%22%5D%7D%2C%22version%22%3A%7B%22major%22%3A0%2C%22minor%22%3A0%7D%7D%2C%22grapher%202%22%3A%7B%22type%22%3A%22grapher%22%2C%22graded%22%3Atrue%2C%22options%22%3A%7B%22step%22%3A%5B1%2C1%5D%2C%22backgroundImage%22%3A%7B%22url%22%3Anull%2C%22scale%22%3A1%2C%22bottom%22%3A0%2C%22left%22%3A0%7D%2C%22markings%22%3A%22graph%22%2C%22labels%22%3A%5B%22x%22%2C%22y%22%5D%2C%22showProtractor%22%3Afalse%2C%22showRuler%22%3Afalse%2C%22rulerLabel%22%3A%22%22%2C%22correct%22%3A%7B%22type%22%3A%22sinusoid%22%2C%22coords%22%3A%5B%5B0%2C-5%5D%2C%5B2%2C2%5D%5D%7D%2C%22rulerTicks%22%3A10%2C%22range%22%3A%5B%5B-10%2C10%5D%2C%5B-10%2C10%5D%5D%2C%22gridStep%22%3A%5B1%2C1%5D%2C%22snapStep%22%3A%5B0.5%2C0.5%5D%2C%22availableTypes%22%3A%5B%22sinusoid%22%2C%22tangent%22%5D%7D%2C%22version%22%3A%7B%22major%22%3A0%2C%22minor%22%3A0%7D%7D%7D%7D%2C%22answerArea%22%3A%7B%22type%22%3A%22multiple%22%2C%22options%22%3A%7B%22content%22%3A%22%22%2C%22images%22%3A%7B%7D%2C%22widgets%22%3A%7B%7D%7D%2C%22calculator%22%3Afalse%7D%2C%22hints%22%3A%5B%5D%7D) for a shortcut.
- Use the icons in the editor interface to add a few different available functions.
    - Check: at least one available function is required.
- Try clicking through the various buttons in both the editor pane and the renderer.
    - Check: one graph does not affect the other, i.e., they're using separate graph objects.
    - Check: clicking a different template resets the graph.
- Try removing some of the available graph type options; in particular, try removing the option that's currently the active graph type and make sure that the graphs fall back to a different option rather than keep the existing graph open.
- Try saving as JSON and reloading; make sure that the widget on the right starts out blank.
- Try grading the various widgets, especially those with some abiguity (i.e., where multiple choices of points can graph the same function), such as Sinusoid, Tangent, and Absolute Value.

Reviewers: jack

Reviewed By: jack

Subscribers: eater

Maniphest Tasks: T2798

Differential Revision: http://phabricator.khanacademy.org/D10717