`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`.
~Context();
    String getPath() const;
    String getFlagsPath() const;
    String getUserFilesPath() const;
    String getDictionariesLibPath() const;
    String getUserScriptsPath() const;
    String getUserDefinedPath() const;
    
    Strings getWarnings() const;
    VolumePtr getTemporaryVolume() const;
    void setPath(const String & path);
    void setFlagsPath(const String & path);
    void setUserFilesPath(const String & path);
    void setDictionariesLibPath(const String & path);
    void setUserScriptsPath(const String & path);
    void setUserDefinedPath(const String & path);
    void addWarningMessage(const String & msg);
    VolumePtr setTemporaryStorage(const String & path, const String & policy_name = "");
    using ConfigurationPtr = Poco::AutoPtr<Poco::Util::AbstractConfiguration>;
    
    void setConfig(const ConfigurationPtr & config);
    const Poco::Util::AbstractConfiguration & getConfigRef() const;
    AccessControl & getAccessControl();
    const AccessControl & getAccessControl() const;
    
    void setExternalAuthenticatorsConfig(const Poco::Util::AbstractConfiguration & config);
    
    std::unique_ptr<GSSAcceptorContext> makeGSSAcceptorContext() const;
    /** Take the list of users, quotas and configuration profiles from this config.
      * The list of users is completely replaced.