**Describe the unexpected behaviour**
ClickHouse Keeper reached consensus and chose the leader with incorrect configuration:
``` yaml
raft_configuration:
          server:
            - id: 0
              hostname: keeper-0
              port: 44444
            - id: 1
              hostname: keeper-0
              port: 44444
            - id: 2
              hostname: keeper-0
              port: 44444
```
Nodes had different ids to achieve this.
 
**Expected behavior**
Add sanity checks for raft config:
- No duplicate keeper nodes 
- No duplicate ids

We can 
1) Fail if keeper/server starts with such configuration
2) We should not allow to commit this configuration to log even if bad node proposed such change.
int my_server_id_,
    const std::string & config_prefix_,
    const std::string & log_storage_path,
    const Poco::Util::AbstractConfiguration & config,
    const CoordinationSettingsPtr & coordination_settings)
    : my_server_id(my_server_id_)
    , secure(config.getBool(config_prefix_ + ".raft_configuration.secure", false))
    , config_prefix(config_prefix_)
    , configuration_wrapper(parseServersConfiguration(config, false))
    , log_store(nuraft::cs_new<KeeperLogStore>(
                    log_storage_path,
                    coordination_settings->rotate_log_storage_interval,
                    coordination_settings->force_sync,
                    coordination_settings->compress_logs))
{
}
void KeeperStateManager::loadLogStore(uint64_t last_commited_index, uint64_t logs_to_keep)
{
    log_store->init(last_commited_index, logs_to_keep);
}
ClusterConfigPtr KeeperStateManager::getLatestConfigFromLogStore() const
{
    auto entry_with_change = log_store->getLatestConfigChange();
    if (entry_with_change)
        return ClusterConfig::deserialize(entry_with_change->get_buf());
    return nullptr;
}
void KeeperStateManager::flushLogStore()