Viruses as self-assembled nanocontainers for encapsulation of functional cargoes