Do take care to distinguish between operational relationships and management relationships. Puppet class and resource ordering is about satisfying
management relationships -- that is, situations where Puppet can manage resource B only after first ensuring that resource A is in its intended target state. Avoid declaring unnecessary relationships, for there is no upside at all to having such relationships, and it incurs added risk of problems, such dependency cycles. In particular, just because package B uses or interacts with package A does not necessarily imply that A must be managed before B, or vise versa.
Especially take care with run stages, for they are nothing more than a convenient mechanism to apply relationships to many pairs of classes at once. Almost inevitably they apply a lot of unneeded relationships, but they may nevertheless be the best tool for a select few jobs. Indeed,
the Puppet docs say this:
[...] stages should only be used with the simplest of classes, and only when absolutely necessary. Mass dependencies like package repositories are effectively the only valid use case.
I'm inclined to suppose that there may be other valid use cases at certain sites, and I don't think the docs are saying that stages are always the best solution for ensuring that package repositories are managed before all packages, but do take the docs' remark in the spirit in which I think it was intended: run stages are the wrong tool for almost every job.
In your particular case, it may be that class apt::client is indeed one of those rare classes that make sense in a non-default stage, but class extrapkg seems very unlikely to be such a class. In the unlikely event that you need any puppet-application-ordering relationships between resources declared in class extrapkg and (other) classes and resources in stage main, I see no barrier to declaring those relationships explicitly. Relying on doing so instead of needlessly placing class extrapkg in a separate stage may solve some of your problems.