Remove some surface area from Delimited api
diff --git a/src/ty.rs b/src/ty.rs
index f7b9011..ab08230 100644
--- a/src/ty.rs
+++ b/src/ty.rs
@@ -152,10 +152,12 @@
     T: Into<PathSegment>,
 {
     fn from(segment: T) -> Self {
-        Path {
+        let mut path = Path {
             leading_colon: None,
-            segments: vec![(segment.into(), None)].into(),
-        }
+            segments: Delimited::new(),
+        };
+        path.segments.push(segment.into());
+        path
     }
 }
 
@@ -550,14 +552,14 @@
     impl TypePath {
         named!(parse(allow_plus: bool) -> Self, do_parse!(
             qpath: qpath >>
-            parenthesized: cond!(
+            parenthesized: option!(cond_reduce!(
                 qpath.1.segments.last().unwrap().item().arguments.is_empty(),
-                option!(syn!(ParenthesizedGenericArguments))
-            ) >>
+                syn!(ParenthesizedGenericArguments)
+            )) >>
             cond!(allow_plus, not!(punct!(+))) >>
             ({
                 let (qself, mut path) = qpath;
-                if let Some(Some(parenthesized)) = parenthesized {
+                if let Some(parenthesized) = parenthesized {
                     let parenthesized = PathArguments::Parenthesized(parenthesized);
                     path.segments.last_mut().unwrap().item_mut().arguments = parenthesized;
                 }
@@ -580,12 +582,8 @@
                 let (pos, as_, path) = match path {
                     Some((as_, mut path)) => {
                         let pos = path.segments.len();
-                        if !path.segments.empty_or_trailing() {
-                            path.segments.push_trailing(colon2);
-                        }
-                        for item in rest {
-                            path.segments.push(item);
-                        }
+                        path.segments.push_trailing(colon2);
+                        path.segments.extend(rest);
                         (pos, Some(as_), path)
                     }
                     None => {
@@ -657,7 +655,11 @@
             bounds: alt!(
                 cond_reduce!(allow_plus, Delimited::parse_terminated_nonempty)
                 |
-                syn!(TypeParamBound) => { |x| vec![x].into() }
+                syn!(TypeParamBound) => {|x| {
+                    let mut delimited = Delimited::new();
+                    delimited.push(x);
+                    delimited
+                }}
             ) >>
             (TypeTraitObject {
                 dyn_token: dyn_token,
@@ -844,15 +846,14 @@
             bound_lifetimes: option!(syn!(BoundLifetimes)) >>
             trait_ref: syn!(Path) >>
             parenthesized: option!(cond_reduce!(
-                trait_ref.segments.get(trait_ref.segments.len() - 1).item().arguments.is_empty(),
+                trait_ref.segments.last().unwrap().item().arguments.is_empty(),
                 syn!(ParenthesizedGenericArguments)
             )) >>
             ({
                 let mut trait_ref = trait_ref;
                 if let Some(parenthesized) = parenthesized {
                     let parenthesized = PathArguments::Parenthesized(parenthesized);
-                    let len = trait_ref.segments.len();
-                    trait_ref.segments.get_mut(len - 1).item_mut().arguments = parenthesized;
+                    trait_ref.segments.last_mut().unwrap().item_mut().arguments = parenthesized;
                 }
                 PolyTraitRef {
                     bound_lifetimes: bound_lifetimes,