c3e402a4

By: Michael Lynch <git@mtlynch.io>

Use ItemName type for grocery item names throughout core logic

Item names were passed around as plain strings, so the validated
ItemName type only existed momentarily inside the sqlite layer before
being converted back. This widens ItemName usage so names stay typed
across the store interface, business logic, and shared types, matching
how the Section type already flows through the codebase.

Strings are now used for item names only at the true boundaries:
- handlers parse user-controlled form/path input into ItemName and
  render names back to strings (templates, JSON)
- the sqlite package converts ItemName to/from string immediately
  adjacent to SQL reads and writes

types.StoredListItem.Name now uses ItemName (types.ItemSection.Name
already did), and the Store interface methods that take/return item
names use ItemName rather than string. Adds MustCreateNewItemName as a
test helper, mirroring MustCreateNewSection.

Suite timing

Time to Start Worker time Duration Time to finish
Config 2s 8s 8s 11s
Eval 8s 37s 37s 45s
Build 14s 5m59s 1m21s 1m35s
Suite 2s 6m45s 1m33s 1m35s

Timeline

0s10s20s30s40s50s1m1m10s1m20s1m30s