* Experiment a lot with module loading
* Extract methods out of experimental mess
* Fix get module return type
* Only reload() modules during reload() command
* Remove unnecessary default parameter
* Add docstrings and logging statements
* Delete unwanted printout
* Improve logging messages
* Extract methods to a new class ModuleLoader
* Remove unused builtins import
* exec_module in any case at the end
* Clarify docstrings & move get_module method up in file
* Add more additionally excluded modules as array
* Distinguish between user-defined modules and external libraries like numpy
* Improved tracked_import docstring
* Remove _insert_embed suffix before logging
* Fix args.is_reload not defined error
* Refine logic to determine whether module is user-defined or not
* Fix list vs. set type annotations
* Improve docstrings & change order of early return
* Fix spelling mistake of "Reloading"
* Try out custom deep reload
* Make deep reload more robust
* Also reload modules imported as classes
* Move early return up to greatly improve performance
* Clean up comments
* Make methods of Module Loader "private"
* Add backticks around function in docstring
---------
Co-authored-by: Grant Sanderson <grant@3blue1brown.com>