A Replication-based Approach to Parallelizing Protocol Stacks