Add recursive serialization and method caching.

Everytime a method is deserialized, a copy of it is stored in the
__cache__ directory in case it is needed again. This also helps with
importing it in such a way that the source can be accessed again.

Recursive serialization is implemented by enabling a recursive_serialize
flag when initializing Serializable and for each attribute that inherits
from Serializable, we also serialize it if recursive_serialize is True.

TODO: Implement a cache() method which the user of the serialization
methods can call to cache the methods if required.