9.1: Add content_hash field to Element, computed during VDOM evaluation
from type_name + properties + children content_hashes via DefaultHasher.
9.2: Assign stable iced::widget::Id to text_input and scrollable widgets
so Iced preserves widget state (cursor position, scroll offset) across
frames. Ids are cached in a thread_local HashMap to avoid leaks.
9.3 skipped: iced::Element is not Clone and contains Box<dyn Widget>,
making element-level caching impractical without unsafe lifetime hacks.