Adding support for sessions and locking in the KV store

This PR adds support for "sessions". Sessions are a binding layer between nodes, checks and KV pairs. It enables keys to be locked and automatically released when a session is invalidated either due to de-registration, failing health checks, or an operator intervention. This can be used as the foundation for a client leader election system similar to Google Chubby.