Separation of the Element and RenderObject trees

The RenderObject and Element (Widget) trees in Flutter are isomorphic
(strictly speaking, the RenderObject tree is a subset of the Element
tree). An obvious simplification would be to combine these trees into
one tree. However, in practice there are a number of benefits to having
these trees be separate:

Performance. When the layout changes, only the relevant parts of
the layout tree need to be walked. Due to composition, the element
tree frequently has many additional nodes that would have to be skipped.

Clarity. The clearer separation of concerns allows the widget
protocol and the render object protocol to each be specialized to
their specific needs, simplifying the API surface and thus lowering
the risk of bugs and the testing burden.