Given a structure in the AST, provides a type
@spec type(tuple()) :: {:ok, atom() | tuple()} | {:error, term()}
@spec type!(tuple()) :: atom() | tuple()