33697d89

By: Michael Lynch <git@mtlynch.io>

Validate grocery sections with typed values

Add a Section type that trims leading and trailing whitespace and rejects empty section names. Include a MustCreateNewSection helper for known-valid test values and SQLite read paths where invalid persisted data should fail immediately.

Move section-bearing handler and store APIs to use typed section values, converting to raw strings only at user-input, rendering, and SQLite boundaries. Keep item-section JSON and template view models as handler-owned string representations so browser responses remain stable while application logic uses typed values.

Add a SQLite migration that trims legacy section names across grocery items, item-section mappings, stored list items, and section ordering. The migration rebuilds section_ordering through a temporary table keyed by the trimmed name so entries that collide after trimming collapse to the earliest sort order.

Testing:
- ./dev-scripts/run-go-tests
- ./dev-scripts/git-hooks/pre-commit
- nix flake check