feat(xlsx): declarative SheetSpec layer with formulas and named ranges
Adds writeSheets() and writeWithGanttAndSheets() driven by
CellSpec/SheetSpec: formula cells written without cached results so
Excel/LibreOffice recalculate on open, workbook named ranges, cell
notes, row outlines, and header/input/derived/muted/internal style
hooks. Formula strings stay opaque to the writer — pricing semantics
live in the consuming app's emitter. Spec sheets append after the
Gantt sheet so chart-injection sheet indices stay stable. The
named-range recalc test (row insertion absorbed by an open slot) runs
under LibreOffice headless when soffice is available.