[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 
Or, perhaps `dataAttributeProcessors` since that's the name of the value they're pulled from:

```
val dataAttributeProcessors = LiftRules.dataAttributeProcessor.toList
```