Simplify run_synchronously
Add test coverage to perform_async
Rename ‘recurse’ back to ‘run’