**Use case**
Manually modify the contents of ZooKeeper.
Not for normal usage scenarios... mostly for operations engineers.

**Describe the solution you'd like**

Allow INSERT. It should contain only subset of the columns, because some of the columns in `system.zookeeper` table (like numChildren, ctime, etc...) cannot be specified explicitly.

INSERT will perform multiple create operations.

Add a setting to perform set operations (update existing nodes) instead of creating new nodes.

**Additional context**

Also it will be nice to allow "full scan" queries to `system.zookeeper` table to quickly creating dumps.
It can be filtered by condition on prefix of path.

auto evaluated = evaluateConstantExpressionAsLiteral(value, context);
        const auto * literal = evaluated->as<ASTLiteral>();
        if (!literal)
            return false;
        if (literal->value.getType() != Field::Types::String)
            return false;
        res.emplace_back(literal->value.safeGet<String>(), ZkPathType::Exact);
        return true;
    }
    else if (allow_unrestricted && function->name == "like")
    {
        const ASTIdentifier * ident;
        ASTPtr value;
        if ((ident = args.children.at(0)->as<ASTIdentifier>()))
            value = args.children.at(1);
        else if ((ident = args.children.at(1)->as<ASTIdentifier>()))
            value = args.children.at(0);
        else
            return false;
        if (ident->name() != "path")
            return false;
        auto evaluated = evaluateConstantExpressionAsLiteral(value, context);
        const auto * literal = evaluated->as<ASTLiteral>();
        if (!literal)
            return false;
        if (literal->value.getType() != Field::Types::String)
            return false;
        String pattern = literal->value.safeGet<String>();
        bool has_metasymbol = false;
        String prefix;