Close nnclient sessions

Currently the Cisco driver doesn't close nnclient sessions. This
change splits each driver method into two: a public wrapper which
instantiates a session and uses it as a context manager, and a private
implementation which takes a session. This allows sessions to be
passed when methods call each other, while ensuring that they will be
cleaned up when the top-level method returns.