Upload multiple files, batching by backend for efficiency.
Groups files by their target backend, calls each backend's upload_files once with all files for that backend, then merges results in original order.
upload_files(
self,
files: list[tuple[str, bytes]],
) -> list[FileUploadResponse]