Efficient list diff - first pass

This is a first attempt at implementing a key based reordering strategy. The algorithm simply indexes where the nodes should be in the resulting child list, and enforces that each child is in that location in a left to right manner.

Currently there is no attempt to reduce the number of swaps or enough tests to call this production ready.