Cleanup
Block on shutdownComplete to ensure proper GPIO tidy-up

Should eventually re-implement using sync.WaitGroup