Cache fixes

Fixes bugs, including fixes removed from NetworkAtomics (whoops). See individual commit messages.
Those races will still be prevented by 'relaxed consistency'. The counter is still updated atomically - so when you add/sub/read it, you're getting the current value. If we use relaxed consistency then other loads or stores are not ordered relative to the atomic. The atomic access remains atomic (you'd just use a regular variable for un-synchronized). I think you're confusing 'atomic with relaxed consistency' with regular (racy) memory accesses.

The problem 'sequentially consistent' or 'acquire' or 'release' order solves is something like this:

atomic variable A
not-atomic variable X
task 1:
 set X = 5
 set A = 1
task 2:
 wait A == 1
 assert( X == 5 )

If the atomic variable reads/writes were 'relaxed', we would not be guaranteed that in task 1 the write to X would be completed or in task 2 that we don't re-use an old (stale) value for X. *But the X variable itself is not racy because it is an atomic variable! *