move async logic to own class; mutexes protect singleton objects