Use errors.New() not fmt.Errorf() when no fmt string.
Number of operations is per-script not per-transaction.

Reset the counter at the end of each script.
Factor the end-of-script error handling into a function.

Use it to reduce code dpulication in the bip16 case.

In addition we export it so that that a user could run:
for !done && err == nil {
	done, err = s.Step()
}
err = s.CheckErrorCondition()

manually instead of having to run Execute().