Idempotent render

This change prevents us from tearing down and recreating a view when
the new view is functionally identical to the old view.

This has important benefits:

 - when you're changing context within a route, the view itself
   remains stable, and the controller has full control over how and
   when to update the data it's presenting to the view
   layer. (Previously, you got a forced re-render immediately whether
   you were ready for it or not.)

 - when you're changing between routes, you can decide to keep the
   prior view in place, and replace it later when you're ready. (Think
   animated transitions between routes.)

This supercedes the proposed changes in PR #2563 (which has already
been reverted).

Views are "functionally identical" if they have the same prototype, the same context, and the same template.