Route license files through UploadLicenseService and stop fabricating add-on purchases
What
Applies a licence file through GitlabSubscriptions::UploadLicenseService instead of saving the License model directly, and removes the add-on step's fallback to AddOnPurchases::CreateService.
Closes #7 (closed).
Why
The direct save skips update_add_on_purchases, the service's only behavioural addition, so an offline cloud licence's add_on_products never becomes AddOnPurchase rows at upload time. The add-on step covered for that by creating a purchase, which meant the harness supplied the answer a licensing or Duo scenario is there to measure.
A missing purchase is now reported: the command prints the licence type, what the licence carried, what was provisioned, and that the two disagree. The step stays non-fatal, so Geo, airgap and source-dev runs are unaffected and the licence is still recorded.
Contract change
The service refuses online cloud licences, which the previous path accepted. Those belong on the activation-code path; the command detects the case and says so rather than falling back to the bypass.
Also
drift-check gains asserts for the eight upstream symbols the new path depends on, since a rename would degrade quietly into the old behaviour. gce.md and SKILL.md described the removed create path.
Testing
just -f skills/gitlab-simulation/justfile ci passes; just sims-check passes; just drift-check reports 41/0 against master, with the new asserts also passing against v19.3.1-ee. Not re-run against a live VM in this change; the behavioural claim rests on a controlled run on omnibus 19.3.1-ee where the application path was the only variable.