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) {
    var $__wrapper = function b() {
      return $__b.apply(this, arguments);
    };

    $__wrapper.toString = function() {
      return $__b.toString();
    };

    return $__wrapper;
  }(function() {
    return typeof b;
  })
};
```

This keeps both the function name and the scope chain correct.