Fix demo loading spinner hang
- Wrap boot handler body in try/catch so render() always runs, even on unexpected errors
- Add 8s timeout to oauthClient.init() via Promise.race to prevent indefinite hang
- Add 5s AbortSignal timeout to fetch('/api/config')
- Use optional chaining in updateScheduleFormVisibility show() helper to avoid crash on missing elements
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>