Client-side metadata: Allow static type checking

Currently, client-side metadata has to be given as Dict[ClientMetadata|FullyQualifiedIdentifier, Any], so no static type checking can be performed.

# actual
result = client.Feature.Command(metadata={IntMetadata: 1, BoolMetadata: True})

# possible improvement
result = client.Feature.Command(metadata=[IntMetadata(1), BoolMetadata(True)])

Could be implemented in ClientMetadata.__call__, type checking then requires ClientMetadata to be generic.