`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`.
{
private:
    ContextSharedPart * shared;
    ClientInfo client_info;
    ExternalTablesInitializer external_tables_initializer_callback;
    InputInitializer input_initializer_callback;
    InputBlocksReader input_blocks_reader;
    std::optional<UUID> user_id;
    std::shared_ptr<std::vector<UUID>> current_roles;
    std::shared_ptr<const SettingsConstraintsAndProfileIDs> settings_constraints_and_current_profiles;
    std::shared_ptr<const ContextAccess> access;
    std::shared_ptr<const EnabledRowPolicies> row_policies_of_initial_user;
    String current_database;
    Settings settings;  
    using ProgressCallback = std::function<void(const Progress & progress)>;
    ProgressCallback progress_callback;  
    using FileProgressCallback = std::function<void(const FileProgress & progress)>;