Memoize ast.Node.pos property

@memoized_property is very efficient: it _replaces_ the function with a
member variable, it doesn't have to consult any cache, so there's no
reason not to use it. And this makes the Position objects unique.
Use declaration source position to detect unused vars

Instead of using the Variable instances as IDs for usage tracking, use
the source code position of the variable's declaration. This avoids
spurious warnings due to duplicated Variable instances under
non-obvious, but legitimate conditions (modified variable in submodule,
imported files, shadow variables for settings etc.).

The end result is that the warnings are *much* more robust now.