Create a Client decoration called AuditClientAttrs that will store a remote IP address/port, the local IP address/port, and a vector of intermediate address/ports.
Implement AuditClientObserver::onCreateClient to create an instance of AuditClientAttrs and attach it to the newly-created client soon after its construction. The IP addresses and ports will be lifted from the Client's transport session; this may not exist if the thread is not directly running on behalf of an external client connection. AuditClientAttrs may be overridden later in the Client's lifecycle - this is simply the initial set of values that it should hold.