Oh, you can use "source_id" over and over again because you're passing the actual id as the value of the checkbox. Now I see...
Anyway ... build it row-by-row as I described above, I do think that's the easiest approach.
You probably don't really need to write a widget, just a form template that puts out what you want for each row. I don't think you can do what you want with a single form element for all the source_ids, though ...