lib: Introduce new DeviceCommuncation API

The current way of communicating between host<->device (runtime.uploadGraph)
is very tailored for one-off, single-direction communication.
This did not work well for many usecases, like when live programming with Flowhub,
in automated tests, and when treating MicroFlo device as a remote component in NoFlo

New API can currently handle ping/pong