**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.
try
    {
        storage.setZooKeeper();
    }
    catch (const Coordination::Exception &)
    {
        
        tryLogCurrentException(log, __PRETTY_FUNCTION__);
        assert(storage.is_readonly);
        return false;
    }
    if (need_stop)
        return false;
    if (!tryStartup())
    {
        assert(storage.is_readonly);
        return false;
    }
    setNotReadonly();
    
    storage.background_operations_assignee.start();
    storage.queue_updating_task->activateAndSchedule();
    storage.mutations_updating_task->activateAndSchedule();
    storage.mutations_finalizing_task->activateAndSchedule();
    storage.merge_selecting_task->activateAndSchedule();
    storage.cleanup_thread.start();
    storage.part_check_thread.start();
    return true;
}
bool ReplicatedMergeTreeRestartingThread::tryStartup()