eval: allow 'list += x' where x is not iterable but defines list+x (#70)

This is the case for Bazel's depset
(although it really ought to be iterable).

Added regression test using hasfields, which is noniterable but
defines list+hasfields rather arbitraily.

Also: improve UnpackArgs failure when argument is a pointer.
diff --git a/eval_test.go b/eval_test.go
index 9ee38bc..e4d3e3d 100644
--- a/eval_test.go
+++ b/eval_test.go
@@ -186,7 +186,10 @@
 	frozen bool
 }
 
-var _ skylark.HasAttrs = (*hasfields)(nil)
+var (
+	_ skylark.HasAttrs  = (*hasfields)(nil)
+	_ skylark.HasBinary = (*hasfields)(nil)
+)
 
 func (hf *hasfields) String() string        { return "hasfields" }
 func (hf *hasfields) Type() string          { return "hasfields" }
@@ -220,6 +223,17 @@
 	return names
 }
 
+func (hf *hasfields) Binary(op syntax.Token, y skylark.Value, side skylark.Side) (skylark.Value, error) {
+	// This method exists so we can exercise 'list += x'
+	// where x is not Iterable but defines list+x.
+	if op == syntax.PLUS {
+		if _, ok := y.(*skylark.List); ok {
+			return skylark.MakeInt(42), nil // list+hasfields is 42
+		}
+	}
+	return nil, nil
+}
+
 func TestParameterPassing(t *testing.T) {
 	const filename = "parameters.go"
 	const src = `