move msg_id to Connection class; replace tap with tape for testing

Moving `msg_id` means that features don't need to set `id` field anymore; `Connection` will annotate it. This also changes the scope of `msg_id` from per process to per `Connection`.
This should only set an `id` value if one is not present. Some features may require the message id to be known to them so they can correllate responses to individual requests.