pySim-shell: add method to match card profile to card

UICC and old SIM cards can be difficult to tell apart without prior
knowledge of the card. The ATR won't tell if the card is UICC or not.
The only remaining option is to try out if the card is able to handle
UICC APDUs. The same is true for 2G SIM cards. It is not guranteed that
every UICC card will have 2G functionality.

Lets add functionality to match a profile to the currently plugged card
by actively probing it.

Lets also add another profile to distinguish between UICC-only cards and
UICC cards that include SIM functionality.

Change-Id: If090d32551145f75c644657b90085a3ef5bfa691
Related: OS#5274
diff --git a/pySim/utils.py b/pySim/utils.py
index 521abd6..e30c970 100644
--- a/pySim/utils.py
+++ b/pySim/utils.py
@@ -1530,3 +1530,7 @@
         if cla and not cmd.match_cla(cla):
             return None
         return cmd
+
+def all_subclasses(cls) -> set:
+	"""Recursively get all subclasses of a specified class"""
+	return set(cls.__subclasses__()).union([s for c in cls.__subclasses__() for s in all_subclasses(c)])