The first case is simply the "rest" part of "array rest/spread," which
lacked the appropriate cases in `js2-parse-array-literal` and
`js2-define-destruct-symbols`. There's also new logic to make sure that
in the destructuring (rest) case, the rest element comes last (while
spread can occur anywhere).
The removal of the `;; destructuring bind` case of
`js2-parse-array-literal` may require some explanation. It was doing
more harm than good. For example, it assumed that only identifiers
have defaults. Also, calling `js2-parse-destruct-primary-expr` is
unnecessary, since `js2-is-in-destructuring` is already true. Rather
than add the triple-dot logic in two places, it was simpler to stop
distinguishing between destructuring and non-destructuring at this
level, because the grammars are extremely similar. In addition, wacky
"vars" as in `let [f()] = x` throw an error anyway when they hit
`js2-define-destruct-symbols`.