Ensure to only return object in saw_object if object moved

This makes sure we don't accidentally write back objects into slots.
This caused an issue in the concurrent gc, where we would read an object
like @owner in Mutex and write it back afterwards in saw_object.

This last write would overwrite the fact that the object already
unlocked and @owner should be nil. Since we know that the concurrent gc
doesn't move object, we don't have to write back these objects. We
enforce this API by making sure saw_object only returns an object if it
either was forwarded or moved.

Fixes #2894, #2628, #2811