Bugfix: Final clean up thread deadlocks on interrupt.
There is a sleep at the top of the while loop in the clean up thread.
This sleep does not receive interrupts when `PTHREAD_CANCEL_DEFERRED` is set as the cancel state on the thread.
Set the cancel state to `PTHREAD_CANCEL_ASYNCHRONOUS` during the execution of the loop.
This is safe because there are no special locks being held during this sleep at the top of the loop.
Restore the cancel state to `PTHREAD_CANCEL_DEFERRED` once past the sleep.
Add additional checks in the loops for `controller_thread_enabled_e` to potentially catch any situations where an immediate exit would be ideal.
Make sure all locks are unlocked before breaking out of any part of any loop.
Use a try lock when sending signals to child processes rather than a full lock to increase the chance of handling any interrupts.