Rust Atomics and Locks: Low-Level Concurrency in Practice