feat(ocaml-globe): labels + 3D projection + fix behind-camera rejection
New modules:
- Globe.Project: 3D→2D screen projection (to_screen, project_visible)
Fixed: reject points with cw < 0 (behind camera) and depth outside
[-1, 1] (outside clip volume)
- Globe_webgl.Label: HTML overlay labels positioned via 3D projection
Creates/positions DOM elements, only shows specified labels
Fix: Color.t and Mat4.t re-exposed as concrete types (linter had
made them abstract, breaking pattern matching downstream)
8 projection tests with physical invariants:
- Origin → screen center
- Behind camera → None
- Right/up → right/up on screen
- Depth ordering (nearer = smaller)
- Symmetry (mirrored X = mirrored screen X)
- Far clip rejection
- project_visible filters correctly
109 native tests passing.