Good points. The gc job is a single event because garbage collection could take longer than the period between scheduled events. That might cause the garbage collection to run twice in parallel without using flags to tell the second job to not run. Unfortunately if a job fails or times out then the flag may not be cleared and GC won't run at all until the system decides that the previous job had failed.
Another way of doing it is by having a single event doing the garbage collection and using a scheduled job that checks if everything is running. This has it's own complications too.
One issue with upgrading is that in the past the plugin would clear it's config files and clear up after itself. I've fixed this in the development version (but if you don't use the dev version the config will be cleared as usual when you next upgrade). Part of the clearing up is removing the gc job. It's not scheduled until you visit the settings page again :(
The upgrading issue shouldn't be a problem after the next release.