Make arrow functions use lexical arguments

Arrow functions should use lexical arguments from its outer scope.

This also changes to use a lexical this instead of bind this.

Some refactoring to share code and to reuse the temp var in case there are multiple temp vars for this/arguments.

Fixes #449