"newChild == oldChild || !newChild.mounted" assert
"newChild == oldChild || !newChild.mounted" assert

If a StatefulComponent marks itself dirty, gets rebuilt, then its parent
gets rebuilt, its parent will find that its child is from a newer
generation and hasn't changed. Previously, we considered two stateful
nodes to not be syncable even if they were the same; combined with the
way the "old" node looks like it's been put elsewhere (since it's
already been synced), we end up confused as to why the new node is
already mounted.

This fixes the problem by making the canSync logic consider two
identical nodes as syncable (since they are; syncChild() short-circuits
that case), and by changing syncChildren to consider identical nodes as
matches even if they are already synced.

tvolkert/flutter,cbracken/flutter,flutter/flutter,turnidge/flutter,flutter/flutter,Hixie/flutter,cbracken/flutter,tvolkert/flutter,tvolkert/flutter,flutter/flutter,Hixie/flutter,cbracken/flutter,turnidge/flutter,tvolkert/flutter,flutter/flutter,flutter/flutter,jason-simmons/flutter,aghassemi/flutter,cbracken/flutter,flutter/flutter,tvolkert/flutter,Hixie/flutter,cbracken/flutter,tvolkert/flutter,Hixie/flutter,flutter/flutter,jason-simmons/flutter,turnidge/flutter,flutter/flutter,flutter/flutter,cbracken/flutter,tvolkert/flutter,Hixie/flutter,cbracken/flutter,Hixie/flutter,tvolkert/flutter,Hixie/flutter,tvolkert/flutter,flutter/flutter,aghassemi/flutter,Hixie/flutter,aghassemi/flutter,cbracken/flutter,jason-simmons/flutter,jason-simmons/flutter,cbracken/flutter,turnidge/flutter,aghassemi/flutter,Hixie/flutter,Hixie/flutter,cbracken/flutter,turnidge/flutter,tvolkert/flutter