there is currently a mix between a `Client` communicating with the server and `Client`s training on a given task. * [ ] create a new dedicated `ServerClient` which can list tasks and upon joining one returns a specific `DecentralizedClient` or `FederatedClient` * allow for clearer path on where the model is created * allow to have a varied set of `Task` as this would be the only way to get theses (see #647) * separation of concerns, what else * [ ] `DecentralizedClient` and `FederatedClient` would be split in multiple clients * [ ] `{Decentralized,Federated}TrainingClient` which only do the training * [ ] `SecureAggregatorClient` for secure aggregation (see #722) * allows for more "local" messaging and general clearer names of messages/fields * [ ] straighten up client usage by avoiding `onRound*` callbacks indirections * [ ] make it dumber * should not wrap an `Aggregator` * simply expose network calls, such as `sendLocalWeights(weights: WeightsContainer)` & `receiveNetworkWeights*(): AsyncGenerator<WeightsContainer>`