`DataTypeFactory::get` locks a mutex inside shared a context, there was a case when many threads were locked inside it

https://pastila.nl/?0043b3e6/c557368f4cf0eb87a3c6f2cc162bc693

It is not clear which thread locked the mutex for a long time. However, it may be possible to lock less inside `DataTypeFactory::get`.
std::shared_ptr<AsynchronousInsertQueue> async_insert_queue;
    std::map<String, UInt16> server_ports;
    bool shutdown_called = false;
    
    bool are_background_executors_initialized = false;
    Stopwatch uptime_watch;
    Context::ApplicationType application_type = Context::ApplicationType::SERVER;
    
    std::vector<std::unique_ptr<ShellCommand>> bridge_commands;
    Context::ConfigReloadCallback config_reload_callback;
    bool is_server_completely_started = false;
#if USE_ROCKSDB
    
    MergeTreeMetadataCachePtr merge_tree_metadata_cache;
#endif
    ContextSharedPart()
        : access_control(std::make_unique<AccessControl>())
        , global_overcommit_tracker(&process_list)
        , macros(std::make_unique<Macros>())
    {
        
        static std::atomic<size_t> num_calls{0};
        if (++num_calls > 1)
        {
            std::cerr << "Attempting to create multiple ContextShared instances. Stack trace:\n" << StackTrace().toString();
            std::cerr.flush();
            std::terminate();
        }
    }
    ~ContextSharedPart()