func NewThrottlerSquare(initial time.Duration, limit time.Duration, reset bool) Throttler {
	return &tsquare{initial: initial, limit: limit, reset: reset}
}
NewThrottlerSquare creates new throttler instance that
always waits for square growing [1, 4, 9, 16, ...] multiplier on the specified initial duration,
up until the specified duration limit is reached.
If reset is set then after throttler riches the specified duration limit
next multiplier value will be reseted.
package gohalt
import (
	"context"
	"math"
	"regexp"
	"sync"
	"time"
	"golang.org/x/sync/semaphore"
)
type Throttler interface {
	Acquire(context.Context) error
	Release(context.Context) error
}
type tmock struct {
	aerr error
	rerr error
}
func (thr tmock) Acquire(context.Context) error {
	return thr.aerr
}
func (thr tmock) Release(context.Context) error {
	return thr.rerr
}
type techo struct {
	err error
}
func NewThrottlerEcho(err error) Throttler {
	return techo{err: err}
}
func (thr techo) Acquire(context.Context) error {
	return thr.err
}
func (thr techo) Release(context.Context) error {
	return nil
}
type twait struct {
	duration time.Duration
}
func NewThrottlerWait(duration time.Duration) Throttler {
	return twait{duration: duration}
}
func (thr twait) Acquire(ctx context.Context) error {
	return sleep(ctx, thr.duration)
}
func (thr twait) Release(context.Context) error {
	return nil
}
type tsquare struct {
	initial time.Duration
	limit   time.Duration
	current uint64
	reset   bool
}