Add support for .svg+labels fake-images in perseus

Summary:
In preparation for upcoming .svg+labels assimilation, I'm adding support
for .svg+labels in all (actually just most) of the places that images
are used in perseus (the .svg+labels spec is listed below, but it should
probably go somewhere else also). These places include:

 - In standard markdown: `![](blah)`
 - In the image widget
 - In the interactive-graph, grapher, and transformer widgets
 - In the plotter widget (this doesn't actually have support, who needs
   labels in their pictograph plots?!)

To accomplish this, there's now an `SvgImage` component that acts sorta
like an `img` component, but it has the ability to render .svg+labels
images. It handles the downloading of the image and auxiliary files
needed for .svg+labels to work, and falls back to a standard `img`
component if a non-.svg+labels image is specified.

Along the way, a couple things were changed:

 - `.graphie-component` and `img` CSS has been duplicated into each of
   the widgets that actually use it, instead of hanging globally in
   interactive-graph (maybe it should actually be global, but it
   definitely shouldn't be in interactive-graph.less).
 - IE 11 is awful at calculating the height and width of images, so a
   util function which does it correctly is now used, and all of the
   places we calculated image sizes have been changed to use that..

For reference, the .svg+labels spec is as such:

TODO(emily): Put this somewhere better

 - .svg+labels urls are standard urls that end in .svg+labels
 - Given a url "base.svg+labels", where "base" ends in "hash" matching
   `/[a-z0-9]{40}/i`, 3 urls are derived:
   - "base.svg": The actual svg image to display
   - "base-data.json": The data, jsonp encoded, with the static callback
                       name of `svgDataHASH`. Data looks like

```
{
  range: rangedata,
  labels: labeldata
}
```

where `labeldata` and `rangedata` are as described here:
 - The label data is represented as

```
[
  {
    content: "25^\\circ", // Text of the label
    coordinates: [2, 3], // Coordinates of the label
    alignment: "left", // Alignment of the label
    typesetAsMath: true, // Whether the label should be mathified
    style: { transform: "rotate(-90deg)" } // An object of extra
                                           // CSS styles to be
                                           // applied to the label
  },
  ...
]
```

 - The range data is simply the graphie range, and looks like:
    `[[-4, 4], [-3, 3]]`
 - By graphing the labels in the label data on a graphie with the range
   on top of the svg image, the expected image is formed.

Test Plan:
 - Test all of the places images are used in Chrome, Firefox, IE9, IE10,
   and IE11:
   - Add a markdown .svg+labels and normal image, ensure both works
   - Add a .svg+labels and normal image to the image widget, ensure both
     work
   - Add a .svg+labels and normal image as the interactive-graph,
     grapher, and transformer background, ensure all work
   - Add a .svg+labels and normal image as the picture to a pictograph
     plotter, ensure the .svg+labels is turned into .svg and the normal
     image works normally
 - Ensure that labels with a CSS `transform` style work
   - In particular, ensure that in IE, jQuery correctly prefixes it to
     `-ms-transform`.
 - Ensure that image caching correctly works in all browsers:
   - Ensure that if two of the same .svg+labels image are on the same
     page at load, both eventually load
   - Ensure that loading an image, and then loading the same image again
     results in both loading
   - Ensure that adding a .svg+labels or normal image, and then changing
     it to a different .svg+labels or normal image works, for all 4
     combinations
 - Image size in IE11
   - Ensure that in IE 11, the correct size of svg images is calculated
 - Ensure that if the height and width aren't provided, they are calculated:
   - Since almost every usage does provide them, add a markdown image, then
     remove the width and height from the JSON, ensure that it works.

Reviewers: alpert, alex

Reviewed By: alex

Subscribers: aria

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