Fixes #576 & Enforces That `let` Has Dynamic Scope

Old behavior:
```hy
=> (disassemble '(let [[x "test"] [y x] z] (foo)) true)
def _hy_anon_fn_1():
    x = u'test'
    y = x
    z = None
    return foo()
_hy_anon_fn_1()
=> (import functools)
=> (let [[functools.partial "foo"]] functools.partial)
u'foo'
```

New behavior:
```hy
=> (disassemble '(let [[x "test"] [y x] z] (foo)) true)
def _hy_anon_fn_1(x, y, z):
    x = u'test'
    y = x
    return foo()
_hy_anon_fn_1(None, None, None)
=> (import functools)
=> (let [[functools.partial "foo"]] functools.partial)
  File "<input>", line 1, column 7

  (let [[functools.partial "foo"]] functools.partial)
        ^-----------------------^
HyMacroExpansionError: let variables cannot contain periods
```