9f907f5cd0
Copying an Analyzer handle shares the same mutable AnalyzerObj, so a pass had no way to snapshot accumulated facts (variable bounds, modular sets, rewrite/canonical bindings, integer-set domains, literal constraints, transitive comparisons) and keep exploring without mutating the original. This pr adds AnalyzerObj::Clone(), which allocates a fresh AnalyzerObj and copies each sub-analyzer's persistent state through a new per-sub-analyzer CopyFrom. Parent back-pointers are re-established by the fresh constructor rather than copied, and per-query/recursion scratch state is left default. Exposed to Python as Analyzer.clone().