Liveness analysis to avoid memory retention issues

- Iterative, backwards data-flow analysis
- Make sure fields captured by nested defs are never zeroed out.
  This is done elegantly by declaring such fields a being live
  at the exit of the final state; thus, they will never be
  zeroed out.
Fix looping issue when computing last usages of fields

- A missing condition could cause an infinite loop
- Various clean-ups
Enables testing the resetting of lifted local variables

- Adds a hook that lets a derived macro insert additional code
  when zero-ing out a lifted field.
- Adds a variant of the `AsyncId` macro that logs zeroed-out fields.
- Adds a test using this mechanism
Avoid zero-ing out dead fields of primitive value class type

- Zero out fields of type Any
- Zero out fields of value class type