What happens when aliases collide with proper attributes? Could you have an attribute 'foo', combined with an attribute 'bar' with alias 'foo'? If so, how would that work?

Using a ChainMap makes this choice for us. The first level dictionary-- which would contain the attribute with the name collision-- wins.

What happens when a subclass of Foo adds an attribute that masks an alias defined for an attribute of Foo?

Again, the child attribute wins because ChainMap.