fix: accept BytesIO in R2Storage.save() type hint
beartype was rejecting BytesIO objects passed to R2Storage.save()
because the BinaryIO type hint doesn't satisfy beartype's strict
protocol checking for BytesIO instances.
Changed type hint from `BinaryIO` to `BinaryIO | BytesIO` to
explicitly accept both types. This fixes playlist cover uploads
which use BytesIO to wrap image data.
Adds regression test that verifies BytesIO is accepted.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>