Remove hacks from keyword_list factory

Clean up the implementation which was previously hacky and didn't
output quite correctly when reviewed.

Implementation chosen uses a block rather than assignment to ensure
keywords will be different for all role_descriptors generated.