**Describe the solution you'd like**

We already can run clickhouse-server without configured ZooKeeper (the tables will start in read-only mode)
and with configured ZooKeeper, if it starts to be inaccessible at runtime (the tables will be read-only until the session is re-established).

Let's also make it possible to start up when ZooKeeper is unavailable.

**Additional context**

If that will be very hard to implement, we can consider other options:
- lazy attaching of the tables after sever start-up;
- a maintenance mode when the tables are not attached at start-up and require manual ATTACH queries.
const zkutil::ZooKeeperPtr & zookeeper, const String & zookeeper_node, int32_t mode,
    bool replace_existing_lock, const String & path_to_set_hardlinked_files, const NameSet & hardlinked_files)
{
    
    
    bool created = false;
    for (int attempts = 5; attempts > 0; --attempts)
    {
        try
        {
            
            
            
            if (mode == zkutil::CreateMode::Persistent)
                zookeeper->createAncestors(zookeeper_node);
            if (replace_existing_lock && zookeeper->exists(zookeeper_node))
            {
                Coordination::Requests ops;
                ops.emplace_back(zkutil::makeRemoveRequest(zookeeper_node, -1));
                ops.emplace_back(zkutil::makeCreateRequest(zookeeper_node, "", mode));