Break the monolithic chat.tsx into focused hooks (use-attachments,
use-chat-stream, use-voice-recording, use-camera-capture) and
presentational components (chat-components), with shared types and
utils extracted to chat-types/chat-utils.
Review fixes applied on top:
- require auth for the streaming completion (protectedProcedure) so
anonymous board viewers cannot spend the owner's LLM credits
- rename image-only state to images and the picker query options object
to pickerQueryOptions for clarity
- extract AttachPopover, clearPending(), composerEmpty and
releaseAudioResources() to remove duplication