Raise ParseError, not DevError for non-strings.

This way we get a file and line number when hitting this error rather
than just the rather opaque message. Also inspect the variable name for
good measure.
Don't try to look up variables that aren't strings.

Make an effort to fail with a useful error message if you attempt to
treat an undef variable as a hash or array.

Prior to 5ac681f9, puppet would return a useful message if you attempted
to treat an undef variable as a hash: "$var is not a hash or array when
accessing it with foo at /manifest.pp:123".

Following that commit, puppet fails with an extremely unhelpful: "Scope
variable name is a Symbol, not a string" because the variable is :undef.