Reject a JSON payload with error details

When the retry worker runs out of retries and sends a message on to the
error queue, capture as much as we can so you have some hope of
understanding what's going on. This will require a more complicated
replay than simply moving them off this queue onto another exchange, but
that seems reasonable.
Worth documenting what the args are here? Particularly `reason`.