Redis-based Session Replication

Previously, all Tomcat Sessions existed only in memory.  In the case
that a specific instance failed, the data in the Sessions hosted by
that instance would be lost.  In some circumstances this isn't ideal,
so Sessions should be replicated to an external repository.

This change adds support for persisting Sessions to a Redis instance.
It does this by using the RedisStore Tomcat PersistentManager Store
implementation.

As part of this effort the Tomcat container was refactored (it was
already too complicated) and a ModularComponent base type was created.
The ModularComponent allows enables a component to be composed of
multiple "sub-components" and coordinates the component lifecycle
across all of them.

[#66942528]