Agent support

Currently `request()` opens a new socket for each message exchange.
This is definitely bad for performance, so we can implement an `Agent` class that embeds a UDP socket and split the incoming acks.