`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`.
struct QueryFactoriesInfo
    {
        std::unordered_set<std::string> aggregate_functions;
        std::unordered_set<std::string> aggregate_function_combinators;
        std::unordered_set<std::string> database_engines;
        std::unordered_set<std::string> data_type_families;
        std::unordered_set<std::string> dictionaries;
        std::unordered_set<std::string> formats;
        std::unordered_set<std::string> functions;
        std::unordered_set<std::string> storages;
        std::unordered_set<std::string> table_functions;
    };
    
    mutable QueryFactoriesInfo query_factories_info;
    
    StoragePtr view_source;                 
    Tables table_function_results;          
    ContextWeakMutablePtr query_context;
    ContextWeakMutablePtr session_context;  
    ContextWeakMutablePtr global_context;   
    
    ContextMutablePtr buffer_context;  
    
    bool is_internal_query = false;
    inline static ContextPtr global_context_instance;
public:
    
    OpenTelemetryTraceContext query_trace_context;
private: