refactor open AEAD selection

No functional change, just cosmetic. It still looks kind of gross, but
IMO better than before.
diff --git a/src/lib.rs b/src/lib.rs
index f2a85de..b5759ad 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1597,39 +1597,25 @@
         // Select packet number space epoch based on the received packet's type.
         let epoch = hdr.ty.to_epoch()?;
 
-        // TODO: somehow deal with re-ordered 0-RTT data.
-        let aead = if hdr.ty == packet::Type::ZeroRTT &&
-            self.pkt_num_spaces[epoch].crypto_0rtt_open.is_some()
-        {
-            // TODO: buffer 0-RTT packets instead of discarding when key is not
-            // available yet, as an optimization.
-            self.pkt_num_spaces[epoch]
-                .crypto_0rtt_open
-                .as_ref()
-                .unwrap()
-        } else {
-            match self.pkt_num_spaces[epoch].crypto_open {
-                Some(ref v) => v,
-
-                // Ignore packets that can't be decrypted because we don't have
-                // the necessary decryption key (either because we don't yet
-                // have it or because we already dropped it).
-                //
-                // For example, this is necessary to prevent packet reordering
-                // (e.g. between Initial and Handshake) from causing the
-                // connection to be closed.
-                //
-                // TODO: buffer 1-RTT packets instead of discarding when key is
-                // not available yet, as an optimization.
-                None =>
-                    return Err(drop_pkt_on_err(
-                        Error::CryptoFail,
-                        self.recv_count,
-                        self.is_server,
-                        &self.trace_id,
-                    )),
-            }
-        };
+        // Select AEAD context used to open incoming packet.
+        #[allow(clippy::or_fun_call)]
+        let aead = (self.pkt_num_spaces[epoch].crypto_0rtt_open.as_ref())
+            // Only use 0-RTT key if incoming packet is 0-RTT.
+            .filter(|_| hdr.ty == packet::Type::ZeroRTT)
+            // Otherwise use the packet number space's main key.
+            .or(self.pkt_num_spaces[epoch].crypto_open.as_ref())
+            // Finally, discard packet if no usable key is available.
+            //
+            // TODO: buffer 0-RTT/1-RTT packets instead of discarding when the
+            // required key is not available yet, as an optimization.
+            .ok_or_else(|| {
+                drop_pkt_on_err(
+                    Error::CryptoFail,
+                    self.recv_count,
+                    self.is_server,
+                    &self.trace_id,
+                )
+            })?;
 
         let aead_tag_len = aead.alg().tag_len();