Use AssemblyStepLocation instead of UserSymbol for scope keys

Identify scopes by the AssemblyStepLocation that defined the last
non-local symbol instead of the symbol itself. If a variable symbol was
redefined, it was possible to reenter a scope. Using the
AssemblyStepLocation of the last definition solves this issue, but
introduces another one: if multiple non-local symbols AND multiple local
symobls are defined on the same AssemblyStepLocation, the local symbols
will be in the same scope, even though they shouldn't. There's no easy
way to fix this at the moment, but I don't think it's a major issue
(it's certainly less surprising than connecting scopes that may be very
far apart).