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.