Cache fiat element on ufl element.

This trivial change causes fiat_from_ufl_element to drop from 5s to
nothing on the wave demo.
WeakKeyDict cache implementation

It turns out that some FiniteElements have __slots__ set. This uses a
weak key dictionary to implement a non-leaking cache instead of
caching FIAT elements directly on the UFL ones.
Merge pull request #231 from firedrakeproject/fiat_element_cache

Cache fiat element lookup.