The bad news is that the Channel API is unidirectional and non blocking, so there is no way to wait for a response or specify a callback. However...
The Elements of the Channel API section of the Channel Python API Overview says the role of the server includes "Receiving update messages from clients via HTTP requests". Therefore by sending a unique message identifier in each channel message, clients could acknowledge them asynchronously via HTTP. The server could re-send the unacknowledged messages after each one times out.
Maybe it's still bad news, because this suggestion looks too much like your "writing a transactional system for messaging" although the asynchronous part would be better that synchronous socket.io.