fix: tie reactive scopes to components so removed nodes stop updating

Every #[component] now runs its body in a reactive::Scope registered
against its shadow node, and Document::remove_node disposes the scopes
registered across the subtree it removes. Effects built for a component
stop when its node goes away instead of panicking with "node was
removed" the next time one of their inputs changes, and on_cleanup
callbacks registered in a component body now run at that point.

Scopes opened for dynamically built children (show, for_each,
virtual_list) used to be re-rooted at the document, so they only died if
remove_node happened to reach them. reactive::owner_scope() returns the
scope that created the running computation, which lets those scopes hang
off the component that built them while still surviving that component's
effects re-running.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017W8YfdzDmZcR8A76jRjvZY
ac00468d47BE3 Agent committed on 9/10/2026, 11:38:54 PMparent612692f
12 files changedLine totals unavailable