Add Instapaper integration with automatic article sending
Features:
- Automatically send bookmarks to Instapaper when tagged with reading list tag
- Encrypted credential storage using AES-GCM encryption
- Credential validation before saving (tests Instapaper API connection)
- Settings UI with toggle, username/password fields
- Enhanced success feedback with checkmark and verification message
- Silent failure pattern: bookmark updates succeed even if Instapaper fails
Security:
- Separate ENCRYPTION_KEY environment variable for credential encryption
- AES-GCM with 256-bit key derived via PBKDF2 (100,000 iterations)
- Passwords never logged or returned in API responses
- Credentials only decrypted when actively needed
OAuth improvements:
- Fix BASE_URL auto-detection to properly handle ngrok HTTPS forwarding
- Check X-Forwarded-Proto header for correct protocol detection
- Support dynamic ngrok URLs without manual configuration
Database:
- Migration 002: Add instapaper_enabled, instapaper_username_encrypted,
instapaper_password_encrypted columns to user_settings
Testing:
- All 73 tests passing
- Unit tests for encryption round-trip
- Unit tests for Instapaper API client with mocked fetch
- Integration tests for settings API with credential validation