This normalizes the SecretData serialization from the client to address #981.
When serializing objects sent to the service with secrets, we would turn it into a SecretData
We use SecretData to convert this:
`{"auth": {"user": "A", "personal_access_token": "B"}}`
to this:
`"auth": { "secret": { "url": "https://KEYVAULT-URL" }}`
Currently, in the case we have a SecretData we've not yet saved, the serialized form looks like this:
`{"auth": { "secret": {"user": "A", "personal_access_token": "B"}}}`
This PR simplifies the client side serialization to this:
`{"auth": {"user": "A", "personal_access_token": "B"}}`
We're experiencing a bug where Unions of sub-models are getting downcast, which causes a loss of information.
As an example, EventScalesetCreated was getting downcast to EventScalesetDeleted. I have not figured out why, nor can I replicate it locally to minimize the bug send upstream, but I was able to reliably replicate it on the service.
While working through this issue, I noticed that deserialization of SignalR events was frequently wrong, leaving things like tasks as "init" in `status top`.
Both of these issues are Unions of models with a type field, so it's likely these are related.
Catch argparse argument type errors and display them in a simplified fashion.
As an example, this is how the output is rendered.
```
❯ onefuzz template libfuzzer basic --target_env ASAN_OPTIONS=allocator_may_return_null=1 a a a linux
unable to parse arguments: unable to parse value as a key=value pair: 'a'
❯
```
Note, this builds upon #910.
This enables specifying the endpoint configuration for alternate tenants purely on the command line.
Previously, on a single tenant you could use the following:
```
onefuzz --endpoint https://INSTANCE.azurewebsites.net info get
```
For multi-tenant installs, we need to expose more than just endpoint.
This enables:
```
onefuzz --endpoint https://INSTANCE.azurewebsites.net --client_id CLIENT_ID --authority https://login.microsoftonline.com/common --tenant_domain TENANT_DOMAIN info get
```
If we login successfully, save the login data immediately. That way if users run a second command before the first one finishes, they only have to login once.