Generalize bulk_operations logic

LMS-11366

@nasthagiri @cpennington please review
Since this is now generic to both read and write, why isn't this called `BulkOperationRecord`?