Allow const/let/var above declaration if not used.

(this is a re-opened PR #1658 against `master` instead of the removed `2.x` branch)

Ref gh-1462

@valueof I made it work for `const` but I have no idea how to make it work for `let`. From what I see, `var` & `const` are handled by one data structure (though with weirdnesses like `var` being written as `unused` when not used and `const` being just `const` in such a case just with a special `unused` property written in a different structure that is ignored in the `var` case...) but `let` is handled in a completely different way.

I spent some time looking at the code but I cannot figure out what's exactly going on here... Could you help me make it work for `let` as well?
> I'd be happy to make const work more or less let.

This sounds great. Mozilla's `let` is bad, it will go away soon so I don't think it's worth dragging its support.

Explain for the stupid, what's the Temporal Dead Zone?