Towards Functional Macrocycles: Self-Assembly and Template Strategies