new(term()) :: {:ok, term()} | {:error, atom()}
new!(term()) :: term()
parse(String.t()) :: {:ok, term()} | {:error, atom()}
valid?(term()) :: true | false
valid?(String.t()) :: true | false