Add symmetric coroutine control transfer

Issue

Currently Coroutines TS only supports asymmetric control transfer where suspend always
returns control back to the current coroutine caller or resumer. In order to emulate
symmetric coroutine to coroutine control transfer, one needs to build a queue and a
scheduler: prior to suspension, a coroutine enqueues the next-to-resume coroutine
into a scheduler queue and then returns control to its caller. At some point, control will
transfer to a scheduler loop that dequeues and resumes coroutines.

Recursive generators, zero-overhead futures and other facilities require efficient coroutine
to coroutine control transfer. Involving a queue and a scheduler makes coroutine
to coroutine control transfer inefficient. Coroutines need direct and efficient way of
expressing the desired behavior.

Proposed resolution:

Allow await_suspend to designate a coroutine to perform a symmetric
control transfer to.

Add library function noop_coroutine that returns a handle to a coroutine
that has no observable side effects when resumed. Having such a coroutine handle
allows library writer to perform either symmetric or asymmetric control transfer
based on runtime considerations.

Implementation and usage experience:

Wording

Core wording:

(3.7) — await-suspend is the expression e.await_suspend(h), which shall be a prvalue
of type void,orbool, or std::experimental::coroutine_handle<Z> for some type Z.

Modify paragraph 5.3.8/5 as follows:

5 The await-expression evaluates the await-ready expression, then:

(5.1) — If the result is false, the coroutine is considered suspended. Then,
the await-suspend expression is evaluated.
If that expression has type std::experimental::coroutine_handle&LT;Z&GT;
and evaluates to a value s, the coroutine referred to by s is resumed as if by a call
s.resume().
[Note: Any number of coroutines may be successively resumed in this fashion,
eventually returning control flow to the current coroutine caller or resumer (8.4.4) -- end note]
If that expression has type bool and evaluates to false,
the coroutine is resumed. If that expression exits via an exception, the exception is caught, the
coroutine is resumed, and the exception is immediately re-thrown (15.1). Otherwise, control
flow returns to the current coroutine caller or resumer (8.4.4) without exiting any scopes (6.6).

Library Wording:

Add the following to &LT;experimental/coroutine&GT; synopsis in [support.coroutine]/1: