Fine-grained, optimistic, lazy-deleting lock implementation; TODO: instead of creating one thread per op, create 1..8 threads and have each thread take on n_ops/n_threads of the work