Fix deadlock during token refresh in IOManagerDmsProxy
- Refactor IOManagerDmsProxy code so the token expiry and refresh through ensureIOManager() is in the IOManagerDMSProxy and not in the DMSIOManagerFactory. Use shared_ptr and mutex to make sure one thread is not refreshing the IOManager while another thread tries to use it.
- Refactor IOManager creation so it's possible to share a CurlHandler between the IOManagers created by IOManagerDmsProxy. This avoids the CurlHandler getting deleted when token refresh happens.