There were logic errors and use-after-free errors with the attribute removal function. Because the custom data layers are reallocated, we can't reuse the name pointer after removing an attribute. And we can't return early on the first domain to fail for the edit mode implementation, because another domain might have the attribute. Also reorganize some of the code to make the logic clearer: only remove sub-attribuutes and change attribute names after actually removing the attribute,and assert if the attribute isn't removed after it is found.