more shift/reset boilerplate
first cut at nonlocal returns