I have a private branch where I've started working towards decoupling the capture from the rest of the client, but it's still WIP and not ready for the the light of day.
I can tell you the approach I'm using, though I realize it's not quite in line with how you're looking to do it.
Basically, I've created an abstract base class that has the same interface as EQPacket. A scaled down version of EQPacket still exists as a subclass of the abstract base, so users that still want to use the existing (integrated) capture can. Then I created another subclass to handle spinning up the listener socket, etc. As you would expect, any functionality that's shared between the two (opcode processing, etc.) lives in the base class, and each subclass handles its implementation-specific parts. Then the server just forwards the raw packets to the client, and the client still handles all the packet parsing, opcode dispatch, etc.