downgrade `Variant` to take only types instead of shapes as arguments, acting as circuit breaker for recursive structures