Separate out Completer

Completion is really a feature, not a essential attribute of a shell,
and therefore is best implemented as decorator.