Mime multipart request parsing.

#139
This implementation includes several layers of support for reading multipart request bodies.
1. The lowest level is the MultipartReader that can parse any stream minimal buffering. It gives you the headers and body of each section one at a time and then you do what you want with the body of that section (buffer, discard, write to disk, etc.).
2. The next level up supports buffering the individual bodies to memory or disk and returning you an  IEnumerable of all the sections.
3. The next level up exposes extension methods on HttpRequest to determine if this is a multipart request and to read it using the methods from level 2 above. This will also cache the results in a feature interface so they can be accessed again by later calls.
4. There is also extension method support for reading nested multipart entries.

Here is a functional sample:
https://github.com/aspnet/Entropy/commit/4e083df512b90666f65cf406eae6c7128649c7fd

None of this work is prescriptive about how you want to interpret the content. If we want to interpret it as files then we would add one additional layer that would read the content-disposition header to get the file details. However, when we get strongly typed headers that information should be more readily available anyways.
This is for caching. Multipart is a general format that supports forms, files, and a variety of other types.  We cache just like we would with application/x-www-form-urlencoded, to avoid parsing the whole body multiple times.

When a form with files is uploaded (multipart/form-data) you ask for the form data separately from the files (ReadFormAsync vs ReadFileUploadsAsync).  When you ask for form fields we parse the multipart once and cache it, then we select the sections that are form fields and populate the form collection. Then when you ask for files we check the cached multipart sections and return the ones that are files.