expose high level subscription interface, tested as much as possible but broken until we add async support