On our current backends, an atomic write is just a write followed by a memory fence, but on some future ones (e.g. the WebGPU one), fences supported only implicitly through use of atomic data types. It turns out that in most (all?) cases, we only need fences for these "atomic writes". The possible exception is single pass scan, but we will not use that for the WebGPU backend anyway.
On our current backends, an atomic write is just a write followed by a memory fence, but on some future ones (e.g. the WebGPU one), fences supported only implicitly through use of atomic data types. It turns out that in most (all?) cases, we only need fences for these "atomic writes". The possible exception is single pass scan, but we will not use that for the WebGPU backend anyway.