Improve fault tolerance by handling leadership election and other metadata changes

### Inside `client.py`

- when a `send` fails inside `broker_aware`, reset `topics_to_brokers`
- when at least one message could not be sent, raise a `FailedPayloadsException`

### Inside `conn.py`

- when a `send` or `recv` fails, set a `dirty` flag
- inside `send`, if the `dirty` flag is set, reinit connection