Make COMPUTED_KEYS into an instance variable.

This will allow it to be computed dynamically based on the class
hierarchy.
Remove some do-nothing constructors.
Extract a mixin class, ProjectdescEnvironmentMixin.

This mixin can be used when the "projectdesc" value is desired.
Implement StaticRecipientsEnvironmentMixin.

It is like the old HardcodedRecipientsEnvironmentMixin (which it
replaces), but it is more flexible: each type of recipient can be
specified independently.

Reimplement ConfigRecipientsEnvironmentMixin on top of the new mixin.
Extract a function choose_environment().
Separate out a MaxlinesEnvironmentMixin.

Configure it via a ConfigMaxlinesEnvironmentMixin.
Separate out a FilterLinesEnvironmentMixin.

Configure it via a ConfigFilterLinesEnvironmentMixin.
Extract a mixin ConfigOptionsEnvironmentMixin.

Move the bulk of ConfigEnvironmentMixin to this new class.  This
leaves a trivial ConfigEnvironmentMixin class behind, which other
classes can inherit from to get access to config without pulling in
all of the options processing of ConfigOptionsEnvironmentMixin.
Merge branch 'more-mixins'

Continue splitting the Environment classes into a bunch of Mixin
classes that can be mixed and matched at runtime to create a custom
environment.