Enhance SingleSignOnAuthenticationMechanism implementation to simplify clustering integration.
 * Extract SingleSignOnManager interface - make SingleSignOnAuthenticationMechanism concrete
 * Add InMemory implemenation of SingleSignOnManager, based on previous SingleSignOnAuthenticationMechanism implementation.
 * Make SingleSignOnEntry an interface, move implementation to InMemorySingleSignOnManager
 * Move SingleSignOn identifier generation responsibility to SSO manager
 * Add SessionManager.getDeploymentName() to uniquely identify manager, add hashCode(), equals(...) methods
 * Now that SessionManager is hashable, map sessions by session manager instead of session id - session ids don't actually have to be unique across deployments.
   - Fetching sessions via session manager (instead of deployment name) simplifies the clustering code, which will need to lookup the Session from the SessionManager via its session id
Other SingleSignOnAuthenticationMechanism fixes:
 * SSO id session attribute is accessed during sessionDestroyed listener but is never set.  Set the attribute during session assocation.
 * seenSessionManagers set is accessed but never populated
 * Use WeakHashMap to fix memory leak of session manager instance following undeploy