campaigns: add user credential storage
Created by: LawnGnome
This will close #14989.
TODO
- Resolve conflicts.
- Schema updates:
- Split external service ID in the table into the repo type/slug fields to match the design document.
- Migrate the table to a more generic table with a domain field, as suggested.
- Add tests for
newGithubSource()
andnewGitlabSource()
for the credential cases. - Fix other test breakage.
- Verify that secret storage works as expected.
- Lots of testing.