Snapshot the blocks into immutable bytes and trim the buffer BEFORE any await, so no memoryview is held across async yield points. Without this, a concurrent filter() or stop() call could try to extend() or clear() the bytearray while a memoryview still exports it, raising "Existing exports of data: object cannot be re-sized".