Keep track of where symbols are declared, initialized and assigned.

This will allow us to generate better error messages when we detect
problems inside the interpreter state where we otherwise don't have good
context about what these things are called and where they came from.