I just noticed this... `conn.last_pub(1)` should be `conn.last_pub[1]`, but I have an alternative suggestion.

Even though we have async heartbeat messages that the `Writer` has to handle... every `PUB` or `MPUB` command can expect exactly one `FRAME_TYPE_RESPONSE` or `FRAME_TYPE_ERROR` ***in the order they were sent***.

So, if instead we maintained a `callback_queue` instead of just a `response_callback_queue`, we can actually respond to each specific `PUB` or `MPUB` command rather than a generic "this failed callback" like you've currently implemented.

This callback can be optional, but the API would look like this:

```python

def handler(self):
    self.writer.pub("log", "Hello world", callback=self._finish_pub)

def _finish_pub(self, data):
    if data.frame_type_id == nsq.FRAME_TYPE_ERROR:
        logging.error("blablabla")
```

what do you think?