Generators that actually suspend: function*/yield on the resumable VM
Generators were faking it. Calling a `function*` used to run the whole body to completion right then and there, collecting every `yield` into a hidden array and handing back an iterator over that finished list. That is fine for the simplest finite case and wrong for everything else: an infinite generator hung the tab, `const x = yield` could never receive the value passed to `.next(v)`, and all of a generator's side effects fired up front in the wrong order. They are real now, built on the SAME resumable interpreter that fixed async/await: calling a `function*` returns a generator object and runs NOTHING; each `.next()` runs the body to the next `yield`, which suspends it - reifying its stack, environment and try/finally state onto the heap - and resumes it synchronously on the next call. So an infinite `while(true) yield i++` is fine as long as you pull finitely many values, `.next(v)` delivers `v` to the waiting `yield`, `.return()` runs a spanning `finally`, `.throw()` is catchable inside, and `yield*` delegates to any iterable. for-of, spread, destructuring, `Array.from`, `new Map(gen)` and a class whose `[Symbol.iterator]` is a `*method` all drive them through the real iterator protocol. JavaScript language moves 78 to 80; overall holds at 50, because a language feature - however flagship - is not one of the named infrastructure floors (GPU, video, HTTP/2, multi-process) that gate the climb past halfway. 24 behaviour tests, gate 6375/6375.