- Reduce chunk size from 16KB to 4KB for ESP32 stability
- Add 50ms delay after READY before sending chunks
- Move chunk sending inline for proper error handling
- More aggressive backpressure (wait when buffer > 8KB)
- Check WebSocket state before each send
- Better error handling and close event logging
- Set binaryType = 'arraybuffer' explicitly
## Summary
* HTML files are now static, streamed directly to the client without
modification
* For any dynamic values, load via JSON APIs
* For files page, we stream the JSON content as we scan the directory to
avoid holding onto too much data
## Additional details
* We were previously building up a very large string all generated on
the X4 directly, we should be leveraging the browser
* Fixes https://github.com/daveallie/crosspoint-reader/issues/94