Lazy URL.createObjectURL over blob. Cached: first
access creates the URL, subsequent accesses return the same one.
Call revoke to free the URL slot; the next access creates
a fresh URL. ThreadStream.close() auto-revokes as a safety net.
objectURL: Promise<string>