feat(01-03): implement broker client, syncCalendar, and events route (CAL-01)
- client.ts: createFastmailClient(email, appPassword) → tsdav DAVClient via Basic auth
- sync.ts: syncCalendar upserts calendar row, selects ID, fetches+parses VEVENTs with ical.js
- all-day DATE → dtstartDate (Date obj at T00:00:00Z), dtstartUtc=null, allDay=true
- timed → dtstartUtc (JS Date), dtstartDate=null, allDay=false (D-13/Pitfall #3)
- onDuplicateKeyUpdate on calendarId+uid composite key (idempotent)
- routes/events.ts: GET /api/events reads cache only — no tsdav import (T-03-02)
- tsc --noEmit clean; all 6 sync tests pass