Switch headers to come from an interface implementation.

This makes it much more easy to provide dynamic headers. Rather than dealing with a Provider, you can now have a concrete class implement this interface.

Closes #146.