Implement full-fidelity parsing and formatting for the coroutine keyword
Summary:
Supports parsing the `coroutine` keyword as a modifier for function-like constructs in places where `async` is supported today:
1. Function declarations:
```
coroutine function test(): void {}
```
2. Anonymous functions:
```
function foo(): int {
$x = coroutine function() {
return 5;
};
return $x();
}
```
3. Lambdas:
```
function f(): (function(int): int) {
return coroutine $v ==> 1;
}
```
4. Blocks:
```
function test(): void {
return coroutine {
return 1;
};
}
```
In addition to parsing, this diff also implements formatting. It does //most// of the lowering as well. However, I have not yet updated `ast.ml` to include the new `coroutine` construct as a `fun_type`. This step has been left as a `TODO` in the code.
Reviewed By: ericlippert
Differential Revision:
D4884746
fbshipit-source-id:
9489e9c11b4d9bcdca44b58a6c69cf2170c96fa0