This method creates a Job object that is a child of the ioRootJob. Using
this job a CoroutineScope is created. The return object is the
class JobControl data class. This
data class contains both the new Job object and the CoroutineScope that uses the Job object.
This construct allows the caller to cancel all coroutines created from the returned CoroutineScope.
Example:
val jobController:JobController = ThreadController.getIOScopeAndRootJob()
val job_1 = jobController.ioScope.launch{ doSomethingUsefull_1()}
val job_2 = jobController.ioScope.launch{ doSomethingUsefull_2()}
val job_3 = jobController.ioScope.launch{ doSomethingUsefull_3()}
val job_4 = jobController.ioScope.launch{ doSomethingUsefull_4()}