To avoid tight coupling, classes should not statically call methods from other classes (with the possible exception of trivial utility methods) and should not instantiate objects (unless instantiating objects is their purpose, e.g. factory or dependency injection container classes). Instead, static methods should be turned into non-static ones, and the object holding them should be injected as a dependency; and new objects should be obtained from dependency-injected factory objects. This is the D of the SOLID OOP principles, and it is there to facilitate unit testing, customization and refactoring. See the dependency injection help page and RfC (although those were written for MediaWiki specifically).
At some point we should convert Parsoid to dependency injection, which raises the question of what the relationship between dependency injection in MediaWiki core and in MediaWiki libraries should be, as libraries should not depend on MediaWiki classes but we probably want to use the same container. Presumably MediaWikiServices should be made compatible with PSR-11 or core should provide a compatibility wrapper, but that still leaves the question of how Parsoid configures its own container and how it overrides it in tests.