[WIP] Your data-lift is my data-lift: Reimplement data-lift as a data attribute parser.

This PR reimplements data-lift as a data attribute parser. This stemmed from a Lift hack day a few months ago, and I'm just now getting around to wrapping this up...

Few points of concern:

* I want to go through at some point and clean up the copy-pasting of helper methods that I did wrt MetaData parsing.
* I'm not entirely sure why I'm having to manually check for the parallel attribute in my parser. My understanding was that if my parser generates a `lift:` node, that should be processed subsequently by the regular SnippetNode parser, which does checks for parallel processing.
* Can someone make sure my implementation of handling parallel is even functional while we're at it? lol

All specs are passing, though. So that's something.

closes #1582 
Could also use `collect`:

```scala
val remainingAttributes = element.attributes.collect {
  case attribute @ UnprefixedAttribute(attributeName, _, _) if attributeName != key => attribute
}
```