Thanks, that answers it. A standalone JSON outside the map files is the part I was hoping for. It means saving a map again in the editor cannot silently drop the lighting, and the file diffs cleanly if the project is in version control.
The split between map bound and event bound effects is the right call too. Keeping the map bound ones on fixed coordinates is predictable, and anything that has to move with a character belongs on the event anyway.