Consider object and array patterns for scope

Currently, using an object pattern like

    var {foo, bar} = baz;

does not add `foo` and `bar` to the scope.

This change adds support for these patterns and extends the current type definitions to make them compatible with esprima. I hope this OK.

I believe there is a deviation from the Mozilla Parser API. Even though `PropertyPattern` is not officially defined, its signature in [`ObjectPattern`](https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Parser_API#Patterns) looks like `{ key: ..., value: ... }` whereas ast-types uses `{key: ..., pattern: ... }`.


Did this ever work actually? `SpreadElement` is not a `Pattern` but we are asserting for `Pattern` at the beginning of the function.