Passkeys migration, structured options and popup.

Follow up to #1143.

Previously, exclusions and pass keys were represented as unstructured strings.

This PR introduces structured classes to represent exclusions, and implements that structure on the options and popup pages. Also, there is a new button to remove an existing exclusion directly from the popup page.

The PR also migrates the legacy setting `excludedUrls` to the new setting `exclusionRules`.

There are still a few issues (styling, in places), but it's ready for others (notably @philc) to try it out.  Is this going in the right direction?

Previously, all options have been treated pretty much as strings, which doesn't work so well for structured options. This PR introduces the idea of a "self-handling option".  The option itself is reponsible for generating its own DOM, and handling "save" and "reset" events.  Not sure if this is the right approach.

The feedback and comments from #1143 have been incorporated here.

As ever, further feedback and comments would be welcome.

It has to be an array, because the order matters.  The pass keys you get for a URL are those associated with the first rule for which the pattern matches the URL.