code: func findField(curr value, minSuperDepth int, f string) (bool, simpleObjectField, bindingFrame, int) {
  	switch curr := curr.(type) {
  	case *valueExtendedObject:
  		if curr.right.inheritanceSize() > minSuperDepth {
  			found, field, frame, counter := findField(curr.right, minSuperDepth, f)
  			if found {
  				return true, field, frame, counter
  			}
  		}
  		found, field, frame, counter := findField(curr.left, minSuperDepth-curr.right.inheritanceSize(), f)
  		return found, field, frame, counter + curr.right.inheritanceSize()
  
  	case *valueSimpleObject:
  		if minSuperDepth <= 0 {
  			if field, ok := curr.fields[f]; ok {
  				return true, field, curr.upValues, 0
  			}
  		}
  		return false, simpleObjectField{}, nil, 0
  	default:
  		panic(fmt.Sprintf("Unknown object type %#v", curr))
  	}
  }
docs: // findField returns a field in object curr, with superDepth at least minSuperDepth
  // It also returns an associated bindingFrame and actual superDepth that the field
  // was found at.