Due to our use of non-async locks in the datastore, we have to asyncify i.e. spawn_blocking every time we acquire a transaction. This is bad for several reasons, including the non-zero overhead of spawn_blocking and the fact that procedures can acquire transactions from the database worker cores, whose single-core Tokio workers are not properly configured to run blocking threads. Instead, we should just use async-aware locks in our datastore, and await acquiring them.