remove optional types

An optional type can either have an optional label or be
    an optional type.

Let's compare

```jsig
foo : (A, B?, C) => void

foo2 : (A, b?: B, C) => void
```

There is a difference between an optional type and an
    optional label.

An optional label means the argument is optional.

i.e. `foo2(A, C)` is valid.

An optional type means the type `B` is nullable

i.e. `foo(A, null, C)` is valid.

Most of the time when you think optional what you really
    mean is an optional argument.

It's recommended that if you truly want a nullable type
    you be more explicit about it. i.e.

`foo3 : (A, B | null, C) => void`

This PR removes optional types completely and tells you
    to use optional labels.

cc @jden @Matt-Esch