Implement a slightly smarter diff algorithm

This diff algorithm looks for sequences that have been inserted in the old sequence.
Before reading it, and running through it on the whiteboard once, I didn't realize that this algorithm does not preserve order.  The current implementation dumps every item in the old list at the first difference encountered.  The reason it does this is so the `removed_callback`s and `added_callback`s reconstruct the children such that their ordering matches the new list.

### Example
Old list = `abc`
New list = `zabc`
Children before algorithm = `abc`

The algorithm runs:
- `a` != `z`, increase the new list pointer.
- `a` == `a`, loop through items that don't exist yet -> `added_callback('z')`.

At this point in the algorithm the current state is:
Children = `abcz`

I do realize, even with @SylvainCorlay 's idea of sending diffs over the line, this still is a problem.  I think what we need to do is add an `index` parameter to the added_callback.  While we're at it, might as well rename `added_callback` to `inserted_callback`...