The learner's snapshot; empty collections when there is no progress
Remarks
Completion and positions are read as whole tables — the ports answer one
lesson at a time, which is right for a use case and wrong for a snapshot of
a 150-lesson catalog. The profile and the location go through their ports,
so their parsing rules stay in one place.
Reads everything the client needs about one learner, in one step.