func NewMultiSender(name string, l LevelInfo, senders []Sender) (Sender, error) {
	if !l.Valid() {
		return nil, fmt.Errorf("invalid level specification: %+v", l)
	}
	if len(senders) == 0 {
		return nil, errors.New("must specify at least one sender when creating a multi sender")
	}
	for _, sender := range senders {
		sender.SetName(name)
		_ = sender.SetLevel(l)
	}
	s := &multiSender{senders: senders, Base: NewBase(name)}
	if err := s.Base.SetLevel(l); err != nil {
		return nil, fmt.Errorf("level %+v is not valid", l)
	}
	return s, nil
}
NewMultiSender configures a new sender implementation that takes a
slice of Sender implementations that dispatches all messages to all
implementations. This constructor forces all member Senders to have
the same name and Level configuration. Use NewConfiguredMultiSender
to construct a similar Sender

Use the AddToMulti helper to add additioanl senders to one of these
multi Sender implementations after construction.

The Sender takes ownership of the underlying Senders, so closing this Sender
closes all underlying Senders.
package send
import (
	"context"
	"errors"
	"fmt"
	"strings"
	"github.com/mongodb/grip/level"
	"github.com/mongodb/grip/message"
)
type multiSender struct {
	senders []Sender
	*Base
}