Remove the templates for VTable and Protocol and split the declarations of protocol objects and protcol functions into different header files to handle circular dependencies.