3 fixes for audio clips losing sound after save/reload:
1. deserializeTracksList: clip-level serverFileId falls back
to extracting from audio_file_url when server_file_id missing
2. serializeTracksList: add server_file_id to track output
so track-level fallback survives round-trip
3. upgrade_project_json_if_needed: include server_file_id
in source_data during legacy project upgrade
- Frontend serialize: use undefined instead of null for synth_engine
- Backend validate: strip None synth_engine from tracks before schema validation
- Prevents 'None is not of type object' schema error