BRANCH_TODO

 * calling getFuncAsyncStatus is triggering machine code lowering too early,
   because the function which does not yet know its own async status may get called
   recursively by one of the callees.
   - don't do any lowering to machine code until async status has been resolved for
     the local call graph sub-tree.

 * detect when a called function is async and make the caller async too
 * generate the async frame type *after* lowering the function to LLVM IR
 * calculate frame size after llvm lowering, ability to inspect with `@sizeOf`
 * spill only values that span across suspension points based on Liveness info
   - handle variable lifetimes correctly - don't die until end curly brace
   - don't pay for spill bytes that are not used - if an i32 spans across suspension point 1
     and a different value which is an f32 spans across suspension point 2, only 4 bytes
     of spill data should be allocated.
   - detect when first N spilled values are the same and avoid redundant stores
 * solve safety panics for bad resume
 * use function pointers instead of resume index to...
   - reduce the number of runtime branches from 2 to 1
   - pass function arguments as normal arguments to the first segment