Add a version of MPI_InitFinalize that adaptively determines the number of threads

Add an option to MPI_InitFinalize to choose the number of threads adaptively in such a way that all cores are used.
I'm just not sure sure about the name of the function. With multithreading, the maximum number of threads per core can be higher than one. So ```set_thread_limit(numbers::invalid_unsigned_int)``` may create more than one thread per core, right ?