implemented QuState.apply_gate

Takes a QuGate as an argument and an optional qubit index. Will scale up standard QuGates to match the appropriate dimensions