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

int32_t session_timeout_ms_, int32_t operation_timeout_ms_, const std::string & chroot_)
{
    log = &Poco::Logger::get("ZooKeeper");
    hosts = hosts_;
    identity = identity_;
    session_timeout_ms = session_timeout_ms_;
    operation_timeout_ms = operation_timeout_ms_;
    chroot = chroot_;
    implementation = implementation_;
    if (implementation == "zookeeper")
    {
        if (hosts.empty())
            throw KeeperException("No hosts passed to ZooKeeper constructor.", Coordination::Error::ZBADARGUMENTS);
        std::vector<std::string> hosts_strings;
        splitInto<','>(hosts_strings, hosts);
        Coordination::ZooKeeper::Nodes nodes;
        nodes.reserve(hosts_strings.size());
        for (auto & host_string : hosts_strings)
        {
            try
            {
                bool secure = bool(startsWith(host_string, "secure://"));
                if (secure)
                    host_string.erase(0, strlen("secure://"));
                nodes.emplace_back(Coordination::ZooKeeper::Node{Poco::Net::SocketAddress{host_string}, secure});
            }
            catch (const Poco::Net::DNSException & e)
            {
                LOG_ERROR(log, "Cannot use ZooKeeper host {}, reason: {}", host_string, e.displayText());
            }