(you don't have to strictly follow this form)

**Describe the bug**
Useless DDLWorker remains in ClickHouse because of zookeeper failing to initialize.
That will cause DDLWorker failing to watch the zookeeper DDL queue normally.
Later, if we perform DDL operations in the cluster, the operation will be hanged.

**How to reproduce**
Configure invalid zookeeper domain name.
* Which ClickHouse server version to use
v20.3.10.75-lts

* Queries to run that lead to unexpected result
```C++
CREATE DATABASE online_smoke ON CLUSTER default_cluster;
```

**Expected behavior**
When Zookeeper fails to initialize normally,we should exit the program.

**Error message and/or stacktrace**
![image](https://user-images.githubusercontent.com/13234323/101854471-970bc500-3b9c-11eb-91f1-4e6e8502c32c.png)


**Additional context**
https://github.com/ClickHouse/ClickHouse/blob/master/src/Interpreters/DDLWorker.cpp#L1110-L1140

```C++
            if (!Coordination::isHardwareError(e.code))
                throw;  /// A logical error.
```
when we meet  a logical error, the exception throwed will be catched by ThreadPool:
![image](https://user-images.githubusercontent.com/13234323/101854838-48125f80-3b9d-11eb-80f0-4f5e0538cc64.png)

I think we should exit the program, when we fail to  initialize `zookeeper`. （But we need to exit the program in a thread, I can not see any code like that）
If there is no problem, I will submit a PR.

const ZooKeeperPtr & zookeeper)
{
    StorageReplicatedMergeTree * replicated_storage = dynamic_cast<StorageReplicatedMergeTree *>(storage.get());
    
    if (!replicated_storage)
        throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Storage type '{}' is not supported by distributed DDL", storage->getName());
    
    
    
    auto get_shard_name = [] (const Cluster::Addresses & shard_addresses)
    {
        Strings replica_names;
        for (const Cluster::Address & address : shard_addresses)
            replica_names.emplace_back(address.readableString());
        std::sort(replica_names.begin(), replica_names.end());
        String res;
        for (auto it = replica_names.begin(); it != replica_names.end(); ++it)
            res += *it + (std::next(it) != replica_names.end() ? "," : "");
        return res;
    };
    String shard_node_name = get_shard_name(task.cluster->getShardsAddresses().at(task.host_shard_num));
    String shard_path = fs::path(node_path) / "shards" / shard_node_name;
    String is_executed_path = fs::path(shard_path) / "executed";
    String tries_to_execute_path = fs::path(shard_path) / "tries_to_execute";
    zookeeper->createAncestors(fs::path(shard_path) / ""); 
    
    zookeeper->tryCreate(tries_to_execute_path, "0", zkutil::CreateMode::Persistent);
    static constexpr int MAX_TRIES_TO_EXECUTE = 3;
    static constexpr int MAX_EXECUTION_TIMEOUT_SEC = 3600;
    String executed_by;