[dartdevc] Destructure optional positional parameters
[dartdevc] Destructure optional positional parameters

Use ES6 destructuring to handle optional positional arguments more compactly.
Note, this doesn't actually change calling convention in DDC, just how
optionals are handled at the callee.

Given Dart:
  void foo(arg1, arg2, [opt1, opt2 = def2]) {
    ...
  }
old JS:
  function foo(arg1, arg2, opt1, opt2) {
    if (opt1 === void 0) opt1 = null;
    if (opt2 === void 0) opt2 = 42;
    ...
  }
new JS:
  function foo(arg1, arg2, opt1 = null, opt2 = def2) {
    ...
  }

We should be able to similar with named params.

Change-Id: I8491a4517d729ab1dec40c1ed2073b9c33cdffe0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/124107
Reviewed-by: Mark Zhou <654f5fe0c4ca6c799b0e735dcf3fc1c389f35bf9@google.com>
Commit-Queue: Vijay Menon <671ecbb18d31a1c038875027dcfe976af959ea9f@google.com>

dart-archive/dart-sdk,dart-lang/sdk,dart-archive/dart-sdk,dartino/dart-sdk,dart-lang/sdk,dartino/dart-sdk,dart-lang/sdk,dart-archive/dart-sdk,dart-lang/sdk,dart-lang/sdk,dart-archive/dart-sdk,dart-archive/dart-sdk,dart-archive/dart-sdk,dartino/dart-sdk,dart-archive/dart-sdk,dart-archive/dart-sdk,dart-lang/sdk,dartino/dart-sdk,dartino/dart-sdk,dartino/dart-sdk,dartino/dart-sdk,dartino/dart-sdk,dartino/dart-sdk,dart-lang/sdk,dart-lang/sdk,dart-archive/dart-sdk