Rust port in nurbs::srf_tool::p3 plus shim, FFI wrapper, difftest runner and
fixtures (Surface.sms, DropCurveSurface.sms, offset_nurb.sms, plus derived and
generated surfaces). 2518 cases, all bit-identical, 0 deferred.
p2 gains remove_knot_conditional_with_status (keeps the surface when upstream
finishes with its flag set, needed by N_SrfJoin which ignores that error);
the p2 runner's surface helpers become pub(crate) for reuse.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero