generator: refactor MultiStrOpt handling

This code was just confusing. Explicitly handle MultiStrOpt differently
from other types to make things more clear.

Change-Id: Ib6a01f76595c8874809c4d6db969ea8200d6fbb2
cfg,generator: add Opt.sample_default attribute

Some default values for configuration options are dynamic and
environment dependent. For example, an option might default to the
hostname of the machine.

However, such default values should never end up in a sample
configuration file - you don't want your hostname or path to your
personal home directory to be included in sample config files.

A simple solution to this is to add a 'sample_default' string
attribute which is used in place of a default, for those cases where
the real value is an unsuitable sample default. For example:

  cfg.StrOpt('hostname',
             default=get_my_host(),
             sample_default='myhostname')

blueprint: oslo-config-generator
Change-Id: I319d128a0a88b1197d8e2be105681f2b56240439
Merge "generator: refactor MultiStrOpt handling"
Merge "cfg,generator: add Opt.sample_default attribute"