Refactor profileManager to support remote stores

The remote talk isn't built yet, but now `profileManager` is in a form that lets
us easily switch between the local DB and a remote pod.

If a profile has a `pod` ID, that's the signal it's located elsewhere, in which
case we'll go through `podClient` to fetch it. If `pod` is `null`, we're the
profile's host and should look in the local `KVSTORE`.

If the profile is absent altogether, then how we create it depends on our role
in the system. If we're a `pod`, we should create the profile locally because
someone's asked us to. Otherwise (specifically, if we're an `apihost`), we pick
a pod to host the profile on and send the creation request.

Neither of the remote pieces are in place - those will take work on `podClient`
and `podServer` - but they're ready to slide in next.