Reimplement -catch: without subscribeForever, and add basic tests

Switches `-catch:` to a one-time subscription, and adds a few tests.