Type Annotations

Type annotations serve as documentation, and as a sanity check to prevent weird types being inferred for miswritten recursive and higher-order functions. The preliminary syntax for annotations is like so:

```
type (a b) map: {a -> b} [a] -> [b]
type succ { int -> int }
```

Or more generally:

```
type (VARS) NAME { TYPE }
```

Where all variables used in `TYPE` must be quantified by `VARS`, and `TYPE` has the following syntax:

<table>
<tr><th>Type</th><th>Meaning</th></tr>
<tr><td><pre><code>a</code></pre></td><td>Value of type <code>a</code></td></tr>
<tr><td><pre><code>a<sub>0</sub> a<sub>1</sub> &hellip; -> b<sub>0</sub> b<sub>1</sub> &hellip;</code></pre></td><td>Function consuming <code>a</code> and producing <code>b</code></td></tr>
<tr><td><pre><code>[a]</code></pre></td><td>Vector with elements of type <code>a</code></td></tr>
<tr><td><pre><code>(a b &hellip;)</code></pre></td><td>Tuple with elements of type <code>a</code>, <code>b</code>, &amp;c</td></tr>
<tr><td><pre><code>{ &hellip; }</code></pre></td><td>Grouping</td></tr>
<tr><td><pre><code>bool
int
text</code></pre></td><td>Intrinsic types</td></tr>
</table>