Fix cross-command cancellation bug

Cancel will now only work if the command is actually being executed. Previously, if you had two commands, calling cancel on one could cancel the second (see test).

Introduced a state mechanism into NpgsqlCommand to manage this.