Currently you would have to pass another proposal to cancel. It might make sense to expire proposals automatically after a certain time window, so as to ensure that there are no un-executed proposals forgotten and lying around.
At the smart contract level code for this is already written in calltypes-and-exec-window branch, but this is not tested and you would need changes to ortypes, ornode and orclient as well.