Add copyBlob to portable abstraction and add S3-optimized variant