`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`.
void addBridgeCommand(std::unique_ptr<ShellCommand> cmd) const;
    IHostContextPtr & getHostContext();
    const IHostContextPtr & getHostContext() const;
    
    void initZooKeeperMetadataTransaction(ZooKeeperMetadataTransactionPtr txn, bool attach_existing = false);
    
    ZooKeeperMetadataTransactionPtr getZooKeeperMetadataTransaction() const;
    
    void resetZooKeeperMetadataTransaction();
    void checkTransactionsAreAllowed(bool explicit_tcl_query = false) const;
    void initCurrentTransaction(MergeTreeTransactionPtr txn);
    void setCurrentTransaction(MergeTreeTransactionPtr txn);
    MergeTreeTransactionPtr getCurrentTransaction() const;
    bool isServerCompletelyStarted() const;
    void setServerCompletelyStarted();
    PartUUIDsPtr getPartUUIDs() const;
    PartUUIDsPtr getIgnoredPartUUIDs() const;
    AsynchronousInsertQueue * getAsynchronousInsertQueue() const;