Pass method in __finalize__
This passes `method` everywhere we use `__finalize__`. I'm trying to get a better sense for

1. When we call finalize (and when we fail too)
2. When we finalize multiple times
3. The overhead of finalize

I haven't called it anywhere new yet (followup PR with that coming though).