redraw the star map: label-box packing with headroom for 400 genres

Names were being culled at default zoom -- 254 of 274 on a 1600px screen, 229 at 1280, 113 on a phone. I first argued against a redraw, on the grounds that zoom recovers most of them (254 -> 271 by k=6) and only two genres, crimsoncourt and folk, were never labelled at any zoom.

• THE CAUSE. drawMap fits each axis to the viewport INDEPENDENTLY, so the world's own aspect is invisible in the render -- only the distribution in normalized space matters.

• It was never an area problem. At default zoom the rendered world is 12.5M px² and 400 labels want 2.7M of it.

• THE FACTOR I GOT WRONG FIRST, and it is the whole thing: drawMap grows type with zoom, fs = min(3, max(1, k^0.85)), so at the default k=2.8 the font is 2.4x, not 1x.

• tools/relayout-map.js relaxes label RECTANGLES until none overlap, each star on a weak spring to where it started, boxes inflated sqrt(400/274) so genres that do not exist yet still get a name.

Verified: verify.sh 12/12, matrix 274/274, explorer-ui PASS (was FAIL on the separation floor), pos-coverage 274/274, full-boot healthy.

▶ Play it: Non Euclidean Court → Teatime Anomaly → Kettle Eschaton — the three genres this change names, as one path https://stellate.app/?genre=crimsoncourt&seed=4741&path=1109.13089,265.13466,1854.5732&xdur=0.093

43ffe4d https://github.com/aboard-io/stellate/commit/43ffe4dd4a7d604748eac046f808123ec93aefca