fix(core): configured frameMetadata reaches the publish path; connect rechecks disposed
frameMetadata({ worker }) only fed the receive-side manager. The engine
worker lookup, the join request capability and publishTrack read
room.options.frameMetadata, so a configured extension now fills that
slice. connect() rechecks `disposed` after it acquired the disconnect
lock, because dispose() can run while a connect waits for a disconnect
to finish.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>