func errorf(c ErrCode, fmtStr string, args ...interface{}) error {
	return &hashTreeError{
		code: c,
		s:    fmt.Sprintf(fmtStr, args...),
	}
}
func errorf(c ErrCode, fmtStr string, args ...interface{}) error {
	return &hashTreeError{
		code: c,
		s:    fmt.Sprintf(fmtStr, args...),
	}
}
// errorf is analogous to fmt.Errorf, but generates hashTreeErrors instead of
// errorStrings.