[feature] Implement skeleton downstream API
This patch refactors the downstream API to use pub/sub socket pair, like the upstream API. This is part of the effort to improve the downstream API. See #2. This patch doesn't touch the client module, which will be adapted in future commits.