refactor shipping calculator compute methods

Most of the shipping calculator `compute` methods take a `package` as an argument, but the underlying computation is being done on a more fundamental property -- like `price`, or `quantity`.

By factoring out the parts that are package-dependent from the parts that are price- or quantity-dependent, we make it easier for people to extend the functionality of these calculators -- for instance, by extending them to compute on `shipments` as well as `packages`, or in any number of other ways. This way we can have the core functionality in the `compute_price` or `compute_quantity` methods and not have to duplicate that logic.