**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.

{
            prefix = path;
            size_t last_slash = prefix.rfind('/');
            path = prefix.substr(0, last_slash == String::npos ? 0 : last_slash);
        }
        String path_corrected = pathCorrected(path);
        
        
        zkutil::Strings nodes;
        zookeeper->tryGetChildren(path_corrected, nodes);
        String path_part = path_corrected;
        if (path_part == "/")
            path_part.clear();
        if (!prefix.empty())
        {
            
            std::erase_if(nodes, [&prefix, &path_part] (const String & node)
            {
                return (path_part + '/' + node).substr(0, prefix.size()) != prefix;
            });
        }
        std::vector<std::future<Coordination::GetResponse>> futures;
        futures.reserve(nodes.size());
        for (const String & node : nodes)
            futures.push_back(zookeeper->asyncTryGet(path_part + '/' + node));
        for (size_t i = 0, size = nodes.size(); i < size; ++i)
        {
            auto res = futures[i].get();
            if (res.error == Coordination::Error::ZNONODE)
                continue;