add stream and pagination for contacts

The only problem is that for groups, there's no way of just getting a list of keys, so we would have to pull all the groups, extract a list of keys, and then fetch the groups one by one.