Adapting Persistent Data Structures for Concurrency and Speculation