refactor quantum gate inheritance / interface

introduce a gate interface, move get_symbol() and
get_matrix() implementation into a parent quantum gate
class
add CNOT gate