Ryan,
In our aggregates, we rhydrate all the streams events into a HistoricEvents[] and simply verify the Eventid hasn't already been applied.
This is purely a belt and braces since the stream itself would be idempotent.
So, our system works this way:
1. Write to Aggregate
2. Event gets emit and we deliver it via Persistent Subscription to another REST endpoint
3. REST endpoint rehydrates second Aggregate (which lifts all previous events)
4. Add the event to the aggregate
5. Save would block duplicates
I know what it's like doing this stuff, and getting hold of other people to chat to is quite tough, so if you want any more detail, just give me a shout and I can try to help out.