I learned that a signal is not changed immediately when encountering an expression, but when the process ends. In this example here:
... signal x,y,z : bit;
The way it works:
Y changes and the process begins.
Y
X will be assigned to what Y's value currently is, but not until the end of the process
X
Y's value
Z will be assigned to not X's old value but not until the end of the process
Z
not X's old value
The process ends so now X and Z will be updated