Material lifecycle: dispose-event subscription, registry teardown,
and the soft-dispose flag that lets callers fire 'dispose' purely
to evict Three's cached RenderObject without actually tearing
down the material.
MaterialManager keeps ownership of the registries; this module
operates on them via a LifecycleCtx so the helpers don't pull in a
back-reference to the orchestrator.
Material lifecycle: dispose-event subscription, registry teardown, and the soft-dispose flag that lets callers fire
'dispose'purely to evict Three's cachedRenderObjectwithout actually tearing down the material.MaterialManager keeps ownership of the registries; this module operates on them via a
LifecycleCtxso the helpers don't pull in a back-reference to the orchestrator.