There are two separate pieces here:

##### 1. DevError is not particularly helpful when you call lookupvar with a non-string.

Sure, you shouldn't be doing that, but given that `#lookupvar` is part of the public API, it is very helpful to ensure that the error will contain a pointer to the culprit file and line number even if all else fails. Please forgive my ignorance of the puppet codebase, but the comments in [error.rb](https://github.com/puppetlabs/puppet/blob/ef33f2de/lib/puppet/error.rb#L56) suggest that DevError is not an appropriate choice here. You will notice that all of the other validation code in `#setvar` uses ParseError as well, not DevError.

The change here is covered by the change in the tests.

##### 2. Puppet regressed in useful error reporting for nested array/hash access on non-array/hash objects.

This behavior was not previously covered by any test. I'll add tests accordingly, but I still think the most important part here is not the specific message, but simply that the error raised will allow the user to determine what happened.