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.
Add StyleCache struct with hash-keyed LRU-eviction strategy and
integrate into StyleSheet via Mutex<StyleCache> so no signature
changes are needed on evaluate_vdom_incr.
- StyleCache::get_or_compute hashes (type_name, props, epoch) -> ComputedStyle
- LRU: full clear on overflow (max 1024)
- RefCell avoided in favor of Mutex so StyleSheet remains Sync
for parallel matching_rules_batch
- Manual Clone impl skips cache (fresh cache on clone)
- Call sites in evaluate_vdom_incr switched from ComputedStyle::compute
to stylesheet.compute_cached
- Cache cleared in build_index after epoch increment (stale entries)