Refactor: Remove multiple copies of same algorithm.

The algorithm to align the columns is fairly generic, and so with a
little tinkering, is now in functional form.  Success, from the
department of DRY!
Add libraries required for Graphviz.

Both of these have extremely permissive licensing, so, nice.
Allow custom classes in Graphviz nodes.

The default version of dagre-d3 assumes that all links and nodes are of
the same class.  Since we specifically want different colors for inputs
and outputs, allowing custom classes seemed to be the most direct course
of action.

I should probably offer this change to upstream.
Add new slide for JS digraph map.

At first, a simple slide in/slide out interface with UI clickable
buttons.  I'll put the digraph into this slide in the <svg> element.
And we have dynamic client-side digraphs.

This is nice because it precludes a round-trip to the server, and
frankly, looks nicer to boot.  We'll have to see how far this
client-side Digraph can take us however, as the library is not as
complete as the CLI's Graphviz program.
Specify utf-8 encoding.

There are a number of symbols in the d3 JS library that are UTF-8
encoded.  Since the other files are all encoded in simple ASCII, then
they are by definition also UTF-8.
No overflow necessary on the SVG.

Users can use their mouse buttons and wheel to navigate around the
image.

Next steps would be to drill down into the image, like seeing individual
vintages and period-specific results, but that's for rounds >>1, since
we haven't even implemented the results side of the DB.
Relax overzealous tests.

I was checking that strings of exceptions matched.  This is potentially
the correct action to take, but I think for now that just raising an
'IntegrityError' is enough.
Do not alter function argument.

The previous iteration of this function altered the input by converting
each element of the passed argument into a string.  This update now does
the necessary string preparations in place, with no surprising
side-effects.  This shouldn't have been a problem, but from the
department of "defensive programming" ...  This implementation should be
slightly more efficient too, not that anyone would notice as this
function is _not_ the bottleneck.

Also, update function comment.