Use tagged endpoints rather than separate methods

This is to allow for easier wrapping of consumers, and
easier passing of consumer messages between processes and
through queues.