Prevent NVDA freeze when brailling math with certain Unicode characters (#20320)
Fixes #20319
Summary of the issue:
NVDA can freeze when MathCAT panics while processing MathML that contains certain Unicode characters (commonly mathematical alphanumeric symbols such as 𝑎 U+1D44E and 𝑏 U+1D44F in , , etc.).
MathCAT's Nemeth braille post-processing can panic on invalid UTF-8 string slicing when real math characters collide with internal placeholder characters. PyO3 exposes this Rust panic as pyo3_runtime.PanicException, which does not inherit from Exception. NVDA's existing except Exception handlers in mathPres/MathCAT/MathCAT.py therefore do not catch it, leaving an unhandled exception on the main thread and triggering watchdog freeze recovery.
Description of user facing changes:
When MathCAT panics on problematic MathML, NVDA no longer becomes unresponsive. The failure is handled like other MathCAT errors: it is logged, the user is notified (e.g. "Error in brailling math."), and NVDA remains usable.
Speech/braille for the affected formula may still be missing or incorrect until MathCAT itself is fixed upstream; this PR only ensures NVDA fails gracefully.
Description of developer facing changes:
Adds MathCATError, a normal Exception subclass used to represent MathCAT failures including PyO3 panics.
Adds _callMathCAT(), a thin wrapper around all libmathcat calls that converts pyo3_runtime.PanicException into MathCATError, so existing except Exception blocks continue to work without importing PyO3 types (which are not reliably importable at module load time).
Adds unit tests in tests/unit/test_mathPres/test_callMathCAT.py.