Abstract recursion fixes

This change detects and disallows recursive operator/array access calls on abstracts. While this is technically a breaking change, the previous behavior only worked incidentally and relied on an implementation detail.