Ensure calls to set! remain well typed
Ensure calls to set! remain well typed

Previously, we retyped *all* variables passed to `set!` as `DynamicTy`,
thus a variable set to a concrete type like `Int`, when `set!` would
suddenly have the type `Dynamic`. This change corrects that issue.
Variables are now typed according to the type of the value passed to
`set!`, and are only typed as Dynamic when the variable itself was
initially typed as `Dyanmic` (declared using defdynamic). To illustrate:

```
;; old behavior
(def x 1)
:i x
=> x : Int
(set! x 2)
:i x
=> x : Dynamic
;; new behavior
(def x 1)
:i x
=> x : Int
(set! x 2)
:i x
=> x : Int
(defdynamic y 2)
:i y
=> y : Dynamic
(set! y 3)
:i y
=>  y : Dynamic
```

eriksvedang/Carp,carp-lang/Carp,carp-lang/Carp,eriksvedang/Carp,carp-lang/Carp