fix: stop slice-plane drift during WASD movement after 4D rotation
The '4D movement bug': after a 4D camera rotation, WASD movement caused all cross-sections on screen to morph. Root cause: CharacterController4D scaled world axes anisotropically (X/Z by move_speed, W by w_move_speed). After a 4D rotation the WASD direction mixes world Z and W, so per-axis scaling tilted the velocity out of the slice plane: drift rate (move_speed - w_move_speed)·sinθcosθ ≈ 0.5 u/s at 45° with default config. Fix: speeds now scale semantic inputs, not world axes. apply_movement takes slice movement (WASD, ⊥ ana) and ana movement (Q/E) separately, each scaled uniformly, so directions are preserved. Verification: - tests/slice_invariant.rs: drives the full app stack (scene, physics, controller, simulation) and asserts the invariant 'camera-space W of any world point is constant during WASD' across rotations and pitch. Failed at 0.47-0.50 drift before the fix; all pass after. - examples/headless_protocol.rs: offscreen GPU captures through the real slice+render pipelines confirm cross-sections no longer morph visually. - regression unit test in character_controller.rs pins the orthogonality property for anisotropic speed configs.