Support for keywords as IdentifierNames such as .catch()

This supports calling libraries which declare properties of objects using reserved words.
This does not support declaring these fields.

`var a = { 'throw': function() {} }` - works
`a.throw()` - works
`var a = { throw: function() {} }` - does not work

Fixes #309
Fixes #351
Fixes #368
Fixes #378
Closes #436