Overloadable data accesor operator

Some more use cases:

We could potentially allow this syntax to be used within object destructuring:

const map = new Map([['key1', 1], ['key2', 2]])
const { @['key1']: value1, @['key2']: value2 } = map

const items = ['a', 'b', 'c', 'd']
const { 0: firstItem, @[-1]: lastItem } = items // This example mixes the data-accessor operator with normal attribute accessing.

We could also implement the data accessor operator on strings, to support negative indexing, like with arrays. We could potentially make this UTF-16-aware, so it doesn't split surrogate pairs, but I'm leaning away from that idea as I understand this to be a O(n) operation.

console.log('abcde'@[-1]) // e