Restructure FunctionSpace __init__ logic

Essentially, the main condition in the __init__ is whether or not we're
passing in a UFL element, or the family and degree as a string/int. This
commit rearranges the code accordingly.

Additionally, in the UFL element case, we were previously pulling apart
the element and replacing it using the mesh's detected cell type. This
gets even more painful once HDiv/HCurl and EnrichedElement are added. I
think we can trust that, if the user goes to the trouble of making their
own UFL element, they know what cell they want.