`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`.
using SampleBlockCache = std::unordered_map<std::string, Block>;
    mutable SampleBlockCache sample_block_cache;
    PartUUIDsPtr part_uuids; 
    PartUUIDsPtr ignored_part_uuids; 
    NameToNameMap query_parameters;   
                                                     
    IHostContextPtr host_context;  
                                   
                                   
                                   
                                   
    ZooKeeperMetadataTransactionPtr metadata_transaction;    
                                                    
                                                    
                                                    
                                                    
    MergeTreeTransactionPtr merge_tree_transaction;     
                                                        
    MergeTreeTransactionHolder merge_tree_transaction_holder;   
    
    Context();
    Context(const Context &);
    Context & operator=(const Context &);
public:
    
    static ContextMutablePtr createGlobal(ContextSharedPart * shared);
    static ContextMutablePtr createCopy(const ContextWeakPtr & other);
    static ContextMutablePtr createCopy(const ContextMutablePtr & other);
    static ContextMutablePtr createCopy(const ContextPtr & other);
    static SharedContextHolder createShared();