Fix method scoping

This fixes the problem brought up by @DmitrySoshnikov where the function expression would shadow outer references with the same identifier. Most of the time the output is the same, e.g.

```js
var a = {
  b() {
    return 'c';
  }
};

// becomes

var a = {
  b: function b() {
    return 'c';
  }
};
```

But if the function has a reference with the method identifier, we have to do more to prevent it from shadowing:

```js
var a = {
  b() {
    return typeof b;
  }
};

// becomes

var a = {
  b: function($__b) {
    return function b() {
      return $__b.apply(this, arguments);
    };
  }(function() {
    return typeof b;
  })
};
```

This keeps both the function name and the scope chain correct.