feat(ocaml-globe): add Satellite abstraction with cached Kepler elements
New module Globe.Satellite:
- v: create from J2000 state vector, precomputes orbital elements
and ghost orbit points (once, at creation)
- position_at: current GL position from precomputed elements (~20 FLOPs)
- trail_positions: per-frame trail array for Orbit.add_trail
- ghost_points: cached full-orbit for Orbit.add_ghost (never recomputed)
- dot: position + color pair for Orbit.draw dots
Eliminates manual caching of elements/ghosts in app code.
Typical usage cuts ~80 lines from main.ml:
let sat = Globe.Satellite.v ~pos ~vel ~color () in
(* once: *)
Orbit.add_ghost gl orbit (Satellite.ghost_points sat) ~color:Color.ghost;
(* each frame: *)
Orbit.clear_trails orbit;
Orbit.add_trail gl orbit (Satellite.trail_positions sat ~dt) ...