Add HashRingManager to wrap hash ring singleton

Currently, the API service creates a new hash ring on every request.
Instead of that, we should cache the hash ring object -- but we should
also expose a way to refresh it when necessary. This method will also
be used by the ConductorManager to cache and refresh the hash ring
when conductors join / leave the cluster.

This patch preserves the existing API behavior by resetting the hash
ring on every request. This should be addressed in a subsequent patch.

Co-Authored-By: Devananda van der Veen <devananda.vdv@gmail.com>
Change-Id: Ib7ab55452499d1e1c362e4cd127f1e6e38106d6c