Signer duplicate check can be performed by requiring signers being sent ordered
Description
Signers are checked for duplicates by creating a memory signers array and looping through this array for every new signer, which is inefficient.
Recommendation
Cache the last signer and assert that the current signer is bigger than the last, require(signer > prevSigner, "duplicate". This is how Gnosis Safe does it, for example.
Status
Addressed in #b03ca97.