The top level coherence object is both application starter and repository of functionality and data that could be separated out and simplify testing.
Two items:
The list of known devices (Actually root devices) The main users of this is the control point in, that therefore has to know about the coherence main object. Suggest separate into a device_list class. This could then be either part of the upnp.core package, even a singleton.
Similarly the coherence object is the web server, this could be separated into its own class. similarly this means that low level classes do not need to know about the top level object.
I have found any time you have a set of packages where the dependancies are in a loop testing becomes a problem.