Requisite thanks
For practice, a generalized merge which can operate on any number of iterables.

This is useful because the first approach to sqldiff sorts the tables and then
scans them with an algorithm that looks an awful,
and applying a diff looks an awful lot like)

If this code took cmp and key functions and then we were polymorphically clever,
it could even be directly used to generate human readable diffs,
by calling merge(cleverness1(L), cleverness2(deletions), cleverness3(additions), ...)
since a readable diff is a list of lines, some of which are not prefixed (the unchanged set)
some of which have +s (the additions), and some of which are prefixed by -s
and in the first approach we spec'd that inputs and outputs are always sorted lists.

I love it when things work the first time I write them.
(okay, to be fair, I haven't tested the generalization part,
but the code works on 2 arrays and it's totally symmetric about which
arrays its working on, so I'm pretty confident)
Support reversed= on merge(), like sorted() does.
Support key= as well.

Now mergesort() matches the API of sorted()
More importantly, merge can now be exploited for clever hacks.
drop(), which is going to come in handy in a moment.
humanized_diff(); only works on V1, so switched back to that.

This elegantly uses merge() with the fact diff()-V1 heavily relies
on sorting to print out the table interleaved with the changes.
Next: use this to experiment; I have this theory that every update
corresponds to an adjacent add/delete, and this will give intuition.

This commit also includes a bunch of scrap code which is work
towards generalized diffu() (using linear programming!)
NOT TO BE USED, but I also don't want to lose it right now,
so it's going into source control.