Waiters should expose the final response in a typed value.
Waiters return WaiterResult which has reason?: any and experimentally that is the final response, but I can't find clear documentation that that's a guarantee, and don't want to cast or validate the value myself.
Seems like this should be generic WaiterResult where T is the possible reason values, or WaiterResult could be a discriminated union covering the different (state, reason) combinations.