live-to-VOD: the operator's finalize enqueues again
The finalize task carried the whole place.stream.video record to publish, but that record's source union has no value until the finalizer has the MUXL CID, and an empty union refuses to marshal, so every /finalize-livestream call died at enqueue with "cannot marshal empty union Video_Source as JSON". The task now carries a VideoDraft (title, description, tags, activity, connections: what is known before the VOD exists) and the publisher builds the record from it at publish time, where PublishVideo fills in the source tracks, duration and thumbnail as before. A round-trip test marshals the task payload the way the queue does (cherry picked from commit 8b9a301c37ca17767d400b454ddc93e436d602ef)