Use a callback for credentials

Instead of making the user choose beforehand, use a callback to let the
user ask a database or human about the credentials.

If desired, a hard-coded value can still be provided via a lambda, e.g.

    (_url, _user, _types) => new UsernamePasswordCredentials() { ... }

/cc @nulltoken @Therzok
The values here are bitmasks for the supported credential types. The types are passed from the library as a single int, and you use `(type & credtype)` to figure out if it's supported.

I'll convert into a `[Fags]` enum.